Scrivendo applicativi per mobile può succedere facilmente di dover accedere a webservice. Nativamente iOS non mette a disposizione primitive ad alto livello per farlo, ma ci sono una serie di librerie sviluppate da terze parti che permettono di utilizzarli senza nessun problema.

Le primitive messe a disposizione dalla Apple sono un po’ troppo a basso livello, sulla rete ci sono molti progetti che le usano per scrivere librerie che permettano allo sviluppatore di accedere ai dati in maniera molto più semplice.

Lo scenario classico è questo: dobbiamo accedere ad un servizio mediante http(s). Il formato di ritorno è un JSON opportunamente formattato.

Per l’esempio possiamo usare i dati prodotti da quest’altro post nel quale si parlava di come fare chiamate REST in PHP.

Iniziamo facendo la chiamata al webservice. Sia che debba fare una chiamata REST, o che ne debba fare una classica passando parametri in GET o POST, normalmente al progetto aggiungo la libreria ASIHTTPRequest che, come dice il nome, permette di fare richieste in HTTP.
A differenza delle primitive messe a disposizione da ObjectiveC, ASIHTTPRequest ne implementa altre a livello più alto che rendono molto più semplice fare request in HTTP.

Tornando al nostro esempio: questa è la chiamata che dobbiamo fare:

1
http://webservices.corradoignoti.it/nomeservizio/showAllArticles

Ammettendo che la risposta sia di solo testo (nel nostro caso è un JSON) e che la velocità di download sia tale da permettere l’esecuzione della request in foreground, questa lo stralcio di codice da usare:

1
2
3
4
5
6
7
8
9
10
- (IBAction)getStringFromURL:(id)sender
{
NSURL *url = [NSURL URLWithString:@"http://webservices.corradoignoti.it/nomeservizio/showAllArticles"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request startSynchronous];
NSError *error = [request error];
if (!error) {
NSString *response = [request responseString];
}
}

Se non si sono verificati errori, alla fine delle chiamata la variabile response conterrà il JSON di risposta del server.
E’ possibile eseguire la stessa chiamata ma in background, utilizzando questo codice:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
- (IBAction)getStringInBackgroundFromURL:(id)sender
{
NSURL *url = [NSURL URLWithString:@"http://webservices.corradoignoti.it/nomeservizio/showAllArticles"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDelegate:self];
[request startAsynchronous];
}

- (void)requestFinished:(ASIHTTPRequest *)request
{
NSString *responseString = [request responseString];
}

- (void)requestFailed:(ASIHTTPRequest *)request
{
NSError *error = [request error];
}

La documentazione di ASIHTTPRequest può essere recupera sul sito della libreria, nella sezine “How to use

In entrambi i casi responseString conterrà il JSON di risposta del servizio, per esempio questo:

1
2
3
4
5
6
7
{
"id": "3",
"type_id": "1",
"protocollo": "26137",
"oggetto": "Bando affidamento fornitura carburanti.",
"testo": "Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper     suscipit lobortis nisl ut aliquip ex ea commodo consequat."
}

Anche per questo compito ci sono mille soluzioni. Nel caso di Tweetee, per fare il parse delle risposte di Twitter, ho optato per json-framework. Libreria molto snella, che permette di accedere alle informazioni contenute in JSON come se si trattasse di dizionari di Objective-C.

Che si traduce in qualcosa di simile a questo:

1
2
3
4
5
6
7
8
9
10
- (NSDictionary *) parseJSONData:(NSData *)data {

SBJSON *jsonParser = [SBJSON new];
NSString *jsonString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSDictionary *dict = (NSDictionary*)[jsonParser objectWithString:jsonString];
[jsonString release];
[jsonParser release];

NSString *testo = [dict objectForKey:@"testo"]
}

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *