Inviare richieste POST in Objective-C

Mattepuffo's logo
Inviare richieste POST in Objective-C

Inviare richieste POST in Objective-C

Oggi vediamo come effettuare richieste POST a un file remoto e leggere la risposta con Objective-C (testao su iPhone e iPad).

E' un argomento di assoluta importanza nel mondo mobile, in quanto in molte app è richiesta l'interazione con un database.

Quindi il primo passo è creare dei file su server nel linguaggio che preferite (ad esempio PHP); nel mio caso specifico ho creato un file che mi serve per interogare il db e vedere se l'utente è registrato (lascio a voi la creazione del file lato server).

Nel file .h avremo una cosa del genere:

#import

@interface ControllerLogin : UIViewController {
    NSURLConnection *connection;
    NSMutableURLRequest *request;
    NSURL *url;
    NSMutableData *dataResponse;
    NSMutableString *strResponse;
}

@property (strong, nonatomic) IBOutlet UIButton *btnLogin;
@property (strong, nonatomic) IBOutlet UITextField *txtUser;
@property (strong, nonatomic) IBOutlet UITextField *txtPwd;

- (IBAction)doLogin:(id)sender;

@end

Il metodo doLogin si occuperà di iniziare tutto il processo.

Poi abbiamo diversi tipi di variabili da usare.

Vi posto il file di implementazione a pezzi, mettendo solo ciò che ci interessa.

 

Per primo il metodo doLogin, che è una action legata al bottone:

- (IBAction)doLogin:(id)sender {
            url = [NSURL URLWithString:@"http://www.sito.it/file.php"];
            request = [[NSMutableURLRequest alloc] initWithURL:url];
            NSString *post =[[NSString alloc] initWithFormat:@"username=%@&password=%@", txtUser.text, txtPwd.text];
            [request setHTTPMethod:@"POST"];
            [request setHTTPBody:[post dataUsingEncoding:NSUTF8StringEncoding]];
            connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
}

Ho omesso i vari controlli da fare sul form, e ricordate che la password andrebbe inviata criptata.

Prima impostiamo l'url del file al quale vogliamo fare la richiesta.

Poi istanziamo la richiesta con quell'url.

Sotto indichiamo la stringa da passare ail file remoto; qui dovete impostare i nomi delle variabili da passare in POST.

Sotto indichiamo il metodo della richiesta (POST per l'appunto).

Completiamo la richiesta.

A questo punto ci sono tutta una serie di metodi di callback da implementare, e ve li metto qui di seguito:

#pragma mark Connessione

// INIZIO CONNESSIONE E CREAZIONE CONTENITORE DATI
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    dataResponse = [NSMutableData data];
}

// PACCHETTI IN RICEZIONE VENGONO ACCODATI
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData*)data {
    [dataResponse appendData:data];
}

// ERRORE DA GESTIRE
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    NSLog(@"%@", [error localizedDescription]);
}

// CONNESSIONE E TRASMISSIONE AVVENUTE CON SUCCESSO
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    strResponse = [[NSMutableString alloc] initWithData:dataResponse encoding:NSUTF8StringEncoding];
    NSLog(@"%@", strResponse);
}

I commenti sono abbastanza esplicativi; ognuno di questi metodi ha una sua funzione specifica:

  • inizializzare la connessione
  • ricevere i pacchetti e accodarli ad un oggetto NSData o NSMutableData
  • gestire l'errore nel caso in cui ce ne sia uno
  • eseguire le dovute operazioni nel caso in cui non ci siano errori; qui viene gestita la risposta

Per leggere la risposta in questo caso ho usato un oggetto NSMutableString; ma ovviamente anche da che tipo di risposta avete (XML, JSON, testo, ecc....) e da cosa ci dovete fare.


Condividi

1 Commenti

  • Alberto

    grazie mille, davvero molto utile e funzionante; se io volessi, dopo aver aperto la sessione php (e mantenendola aperta), ottenere l\'XML di un\'altra pagina web presente sullo stesso sito, come dovrei fare?

    20/11/2013

Commentami!