Aquest document vol fer incÃs en l'ús de les classes necessà ries per aconseguir connectar per via remota amb un servidor web que on puguem enviar i rebre peticions. La primera idea és utilitzar les classes NSURL per realitzar les connexions amb el servidor.
Primer de tot analitzarem algunes de les classes que tenim a la nostra disposició per comprovar que ens poden ser útils. Per fer això utilitzarem la documentació d'Apple i algunes pà gines web on es parla sobre el desenvolupament sobre Cocoa.
En aquest apartat realitzaren uns quants exemple per comprovar rà pidament la possibilitat de rebre i enviar dades a un servidor web. En principi s'utilitzarà la classe NSURLConnection de forma sÃncrona per reduir-ne la complexitat.
El primer exemple que desenvoluparem serà una exemple senzill per carregar una pà gina web qualsevol mitjançant l'ús de la classe NSURLConnection. Aquest exemple és molt senzill i com que no hi ha cap problema en la seva prova no es comentarà a fons.
El següent codi forma part de la funció main d'un projecte de lÃnia de comandes Cocoa per a Mac OS X:
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
// Definició de les variables
NSURL * url; // conté la URL utilitzada
NSURLRequest * peticio; // conté la petició que es realitzarÃ
NSURLResponse * resposta; // contindrà la resposta rebuda
NSError * error; // contindrà l'error retornat si és produeix
NSData * dadesContestacio; // contindrà les dades retornades
NSString * stringContestacio; // contindrà les dades retornades en format string
// Creem la petició
// url = [NSURL URLWithString: @"http://www.comesfa.org/ca/node/2568"];
url = [NSURL URLWithString: @"http://www.vilaweb.com/media/attach/vwedts/podcast.xml"];
peticio = [NSURLRequest requestWithURL: url];
// Enviem la petició i esperem les dades
dadesContestacio = [NSURLConnection sendSynchronousRequest: peticio
returningResponse: &resposta
error: &error ];
// Transformem les dades en string i les mostrem
stringContestacio = [[NSString alloc] initWithData: dadesContestacio
encoding: NSASCIIStringEncoding];
NSLog( @"%@", stringContestacio );
// Alliberem les variables creades
[stringContestacio release];
[pool release];
return 0;
}
Si analitzem el codi podem veure en primer lloc la definició de les variables que utilitzarem en aquest petit programa. La variable url, serà una adreça web que ens indica que volem carregar, també tenim la petició NSURLRequest que s'encarregarà de realitzar la petició, la resposta retornarà la resposta, encara que només la utilitzarem per poder cridar la funció de la classe NSURLConnection, igual que la classe NSError. La classe dadesContestacio conté les dades retornades per la petició i l'stringContestacio serà la traducció a string d'aquestes dades.
El següent que es pot veure és la forma com es creen les dades que necessitem. Primer creem la URL a partir del missatge de classe URLWithString, més senzill impossible. El següent pas es crear la petició, la qual només està formada per la pròpia URL (en posteriors exemples es provarà afegir-hi mètodes GET i POST). Un cop feta la petició la enviem de forma sÃncrona utilitzant el missatge sendSynchronousRequest:returningResponse: error:. Aquest missatge se li passa com a parà metre la petició creada anteriorment i com a parà metres a retornar les referències als objecte resposta i error que hem creat anteriorment. No comprovem que la connexió falli, aixà que donem per segur que sempre funciona, a l'hora de desenvolupar un programa seriós ja ens preocuparÃem de fer-ho correctament. L'últim pas es transformar les dades rebudes en un string per poder-lo imprimir, indicant la codificació idònia. Ja només que fer un NSLog per mostrar que ha funcionat.
L'exemple utilitzat carrega el fitxer xml del podcast de l'internauta. Cal destacar que fa una setmana que no funciona aquest podcast, però per l'exemple ja funciona. S'ha de tenir en compte que depenen de la pà gina d'ha de decidir la codificació de les per treure'n una sortida correcta, aixà en la URL comentada a sobre cal ficar-hi la codificació NSUTF8StringEncoding i al podcast s'ha de posar NSASCIIStringEncoding.
El resultat és el següent:
[Session started at 2005-09-29 10:38:00 +0200.]
2005-09-29 10:38:01.285 AppNSURLConnection[973] <rss version="2.0" ... >
<!--Made With Cast Easy http://www.casteasy.com-->
<channel>
<title>Internauta</title>
<itunes:author>Catalunya Radio / VilaWeb</itunes:author>
<link>http://www.catradio.com</link>
<description>Programa setmanal sobre internet / Weekly radio program in catalan about internet</description>
<itunes:subtitle>Cada dissabte a les tres de la tarda, a Catalunya Radio</itunes:subtitle>
<itunes:summary>Programa setmanal sobre internet / Weekly radio program in catalan about internet</itunes:summary>
<generator>Cast Easy http://www.casteasy.com</generator>
<language>es-ca</language>
<copyright>Catalunya Radio</copyright>
<itunes:owner>
<itunes:name>Catalunya Radio / VilaWeb</itunes:name>
<itunes:email>redaccio@vilaweb.com</itunes:email>
</itunes:owner>
<category>International</category>
<itunes:category text="International"/>
<item>
<title>L'internauta 24/setembre/05</title>
<itunes:author>Catalunya Radio - VilaWeb</itunes:author>
<description>Publicacions digitals</description>
<itunes:subtitle>Ramon Padros, Alex Guiterrez i Miquel Macia parlen sobre els nous mitjans de comunicació dels darrers mesos a la internet catalana</itunes:subtitle>
<itunes:summary>10 anys</itunes:summary>
<enclosure url="http://www.vilaweb.com/media/attach/vwedts/podcast/internauta_24_09_2005.mp3" length="50492000" type="audio/mpeg"/>
<guid>http://www.vilaweb.com/media/attach/vwedts/podcast/internauta_24_09_2005.mp3</guid>
<pubDate>Tue, 26 Sep 2005 16:00:00 GMT</pubDate>
<category>International</category>
<itunes:category text="International"/>
<itunes:explicit>No</itunes:explicit>
<itunes:duration>00:53:51</itunes:duration>
<itunes:keywords>catalan internet catalonia catalunya barcelona vilaweb radio</itunes:keywords>
</item>
<item>
<title>L'internauta 17/setembre/05</title>
<itunes:author>Catalunya Radio - VilaWeb</itunes:author>
<description>Domini .cat</description>
<itunes:subtitle>Joan Jofra, Amadeu Abril, Marc Pifarre, Quico Gras, Jordi Albinyana i Salvador Alegret comenten el reconeixement oficial del Domini .CAT</itunes:subtitle>
<itunes:summary>10 anys</itunes:summary>
<enclosure url="http://www.vilaweb.com/media/attach/vwedts/podcast/internauta_17_09_2005.mp3" length="53915947" type="audio/mpeg"/>
<guid>http://www.vilaweb.com/media/attach/vwedts/podcast/internauta_17_09_2005.mp3</guid>
<pubDate>Tue, 19 Sep 2005 16:00:00 GMT</pubDate>
<category>International</category>
<itunes:category text="International"/>
<itunes:explicit>No</itunes:explicit>
<itunes:duration>00:56:10</itunes:duration>
<itunes:keywords>catalan internet catalonia catalunya barcelona vilaweb radio</itunes:keywords>
</item>
<item>
<title>L'internauta 10/setembre/05</title>
<itunes:author>Catalunya Radio - VilaWeb</itunes:author>
<description>10 anys</description>
<itunes:subtitle>Merce Molist, Manel Sanroma i Oriol Ferran parlen dels inicis de la xarxa</itunes:subtitle>
<itunes:summary>10 anys</itunes:summary>
<enclosure url="http://www.vilaweb.com/media/attach/vwedts/podcast/internauta.mp3" length="52214514" type="audio/mpeg"/>
<guid>http://www.vilaweb.com/media/attach/vwedts/podcast/internauta.mp3</guid>
<pubDate>Tue, 13 Sep 2005 02:05:24 GMT</pubDate>
<category>International</category>
<itunes:category text="International"/>
<itunes:explicit>No</itunes:explicit>
<itunes:duration>00:59:46</itunes:duration>
<itunes:keywords>catalan internet catalonia catalunya barcelona vilaweb radio</itunes:keywords>
</item>
</channel>
</rss>
Executable “AppNSURLConnection� has exited with status 0.
Aquest exemple vol corroborar que es poden enviar variables GET per la URL i l'escript del servidor web les pot recollir i comprovar.
Per fer això primer crearem un escript PHP que agafarà totes les variables GET i POST i les imprimirà de manera que amb una petició NSURLConnection podem comprovar que el servidor les ha rebut. Aquest mateix escript ens servirà posteriorment per comprovar l'enviament de variables POST.
L'escript PHP és el següent.
<?php
/*
* NSURL.php -- Crèdits
* Copyright 2005, Carles Noguera <Carles.Noguera_de_ComEsFa.org>
*
* Aquest programa és de programari lliure; pots redistribuir-lo i/o modificar-lo
* sota els termes de la Llicència Pública General GNU publicada per
* la Free Software Foundation; de la versió 2 de la Llicència, o
* (la versió que escullis) d'una versió posterior.
*
* Aquest programa està distribuït amb l'esperança que serà útil,
* però SENSE CAP GARANTIA; sense cap garantia implÃcita del
* MERCAT o DE PROPÃ’SITS PARTICULARS. Mireu la
* GNU General Public License per més detalls.
*
* @autor <Carles.Noguera_de_ComEsFa.org>
* @creat 29/09/2005
*/
/*
* Comprovem totes les variables GET
*/
echo "<h2>MÈTODE DE PETICIÓ: ". $_SERVER['REQUEST_METHOD'] ."</h2>\n\n";
/*
* Mostrem totes les variables GET
*/
echo "<h3>VARIABLES GET:</h3>\n<P><UL>\n";
foreach( $_GET as $var => $val ) {
echo " <LI><B>$var</B>: $val</LI>\n";
}
echo "</UL></P>\n\n";
/*
* Mostrem totes les variables POST
*/
echo "<h3>VARIABLES POST:</h3>\n<P><UL>\n";
foreach( $_POST as $var => $val ) {
echo " <LI><B>$var</B>: $val</LI>\n";
}
echo "</UL></P>\n\n";
?>
Aquest escript mostra un tÃtol amb el mètode enviat i imprimeix un llistat amb totes les variables enviades
Ara adaptarem el programa anterior AppNSURLConnection afegint-hi un parell de variables afegides a la URL per comprovar que l'escript les carrega. El codi resultat és el següent:
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
// Definició de les variables
NSURL * url; // conté la URL utilitzada
NSURLRequest * peticio; // conté la petició que es realitzarÃ
NSURLResponse * resposta; // contindrà la resposta rebuda
NSError * error; // contindrà l'error retornat si és produeix
NSData * dadesContestacio; // contindrà les dades retornades
NSString * stringContestacio; // contindrà les dades retornades en format string
// Creem la petició
url = [NSURL URLWithString: @"http://anoia.guifi.net/pr149/NSURL.php?nom=Xin&cognom=Xic"];
peticio = [NSURLRequest requestWithURL: url];
// Enviem la petició i esperem les dades
dadesContestacio = [NSURLConnection sendSynchronousRequest: peticio
returningResponse: &resposta
error: &error ];
// Transformem les dades en string i les mostrem
stringContestacio = [[NSString alloc] initWithData: dadesContestacio
encoding: NSASCIIStringEncoding];
NSLog( @"\n%@", stringContestacio );
// Alliberem les variables creades
[stringContestacio release];
[pool release];
return 0;
}
Com podeu comprovar només s'ha afegir un parell de variables a la URL per comprovar que retorna l'escript. Un cop executat ens dona la següent sortida.
[Session started at 2005-09-29 11:21:41 +0200.] 2005-09-29 11:21:42.300 AppNSURLConnectionURLGET[1112] <h2>METODE DE PETICIO: GET</h2> <h3>VARIABLES GET:</h3> <P><UL> <LI><B>nom</B>: Xin</LI> <LI><B>cognom</B>: Xic</LI> </UL></P> <h3>VARIABLES POST:</h3> <P><UL> </UL></P> Executable “AppNSURLConnectionURLGET� has exited with status 0.
Bé, hem pogut comprovar que funciona l'enviament de variables per la URL.
Aquest exemple vol corroborar que es poden enviar variables GET utilitzant el mètode setHTTPBody:dataUsingEncoding: i que l'escript del servidor web les pot recollir i comprovar.
Per fer això primer utilitzarem l'escript PHP anterior que agafarà totes les variables GET i POST i les imprimirà de manera que amb una petició NSURLConnection podem comprovar que el servidor les ha rebut. Aquest mateix escript ens servirà posteriorment per comprovar l'enviament de variables POST.
Bé, al final he ajuntat les variables GET i POST doncs el mètode setHTTPBody:dataUsingEncoding: només funciona sobre mètodes "POST" i les variables GET només he trobat la manera d'enviar-les via la URL.
El codi que utilitzarem serà el següent:
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
// Definició de les variables
NSURL * url; // conté la URL utilitzada
NSMutableURLRequest * peticio; // conté la petició que es realitzarÃ
NSURLResponse * resposta; // contindrà la resposta rebuda
NSError * error; // contindrà l'error retornat si és produeix
NSData * dadesContestacio; // contindrà les dades retornades
NSString * stringContestacio; // contindrà les dades retornades en format string
// Creem la petició
url = [NSURL URLWithString: @"http://anoia.guifi.net/pr149/NSURL.php?pg1=GET1&pg2=GET2"];
peticio = [NSMutableURLRequest requestWithURL: url];
// Enviem la petició i esperem les dades
[peticio setHTTPMethod: @"POST"];
[peticio setHTTPBody: [[NSString stringWithString: @"p0=Parametre0&p1=Parametre1&p2=Parametre2&p3=Parametre3&p4=Parametre4&p5=Parametre5&p6=Parametre6&p7=Parametre7&p8=Parametre8&p9=Parametre9"]
dataUsingEncoding: NSASCIIStringEncoding]];
dadesContestacio = [NSURLConnection sendSynchronousRequest: peticio
returningResponse: &resposta
error: &error ];
// Transformem les dades en string i les mostrem
stringContestacio = [[NSString alloc] initWithData: dadesContestacio
encoding: NSASCIIStringEncoding];
NSLog( @"\n%@", stringContestacio );
// Alliberem les variables creades
[stringContestacio release];
[pool release];
return 0;
}
Veiem que per poder canviar el mètode de la petició, utilitzem la variant mutable NSMutableNSURLRequest per poder canviar aquestes opcions. El mètode setHTTPMethod: s'utilitza per canviar el mètode d'enviament de la petició, per defecte és GET però es pot canviar a POST. Per enviar variables a post s'ha d'utilitzar el missatge setHTTPBody: per enviar aquests parà metres com a POST.
L'exemple desenvolupat retornar la següent sortida:
[Session started at 2005-09-29 11:47:31 +0200.] 2005-09-29 11:47:32.551 NSURLConnectionGET[1298] <h2>METODE DE PETICIO: POST</h2> <h3>VARIABLES GET:</h3> <P><UL> <LI><B>pg1</B>: GET1</LI> <LI><B>pg2</B>: GET2</LI> </UL></P> <h3>VARIABLES POST:</h3> <P><UL> <LI><B>p0</B>: Parametre0</LI> <LI><B>p1</B>: Parametre1</LI> <LI><B>p2</B>: Parametre2</LI> <LI><B>p3</B>: Parametre3</LI> <LI><B>p4</B>: Parametre4</LI> <LI><B>p5</B>: Parametre5</LI> <LI><B>p6</B>: Parametre6</LI> <LI><B>p7</B>: Parametre7</LI> <LI><B>p8</B>: Parametre8</LI> <LI><B>p9</B>: Parametre9</LI> </UL></P> Executable “NSURLConnectionGET� has exited with status 0.
Veiem que ha funcionat com esperavem.