128 votes

iOS : comment effectuer une requête HTTP POST ?

Je suis approche de développement iOS et j'aimerais avoir une de mes premières applications pour effectuer une requête HTTP POST.

Aussi loin que je peux comprendre, je dois gérer la connexion qui s'occupe de la demande par l'intermédiaire d'un NSURLConnection de l'objet, ce qui m'oblige à avoir un délégué de l'objet, qui à son tour va traiter les données des événements.

Quelqu'un pourrait-il préciser la tâche avec un exemple concret?

Je dois contacter un point de terminaison https envoi des données d'authentification (nom d'utilisateur et mot de passe), et un texte simple réponse.

167voto

Anh Do Points 4677

Vous pouvez utiliser NSURLConnection comme suit:

  1. Définissez votre NSURLRequest: Utiliser requestWithURL:(NSURL *)theURL d'initialiser la demande.

    Si vous avez besoin de spécifier une requête POST et/ou les en-têtes HTTP, utilisez NSMutableURLRequest avec

    • (void)setHTTPMethod:(NSString *)method
    • (void)setHTTPBody:(NSData *)data
    • (void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field
  2. Envoyez votre demande en 2 façons, au moyen d' NSURLConnection:

    • Synchrone: (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error

      Ceci renvoie à un NSData variable que vous pouvez traiter.

      IMPORTANT: n'oubliez pas de coup de pied hors de la machine synchrone demande dans un thread séparé pour éviter le blocage de l'INTERFACE utilisateur.

    • Asynchrone: (void)start

N'oubliez pas de mettre votre NSURLConnection du délégué pour gérer la connexion comme suit:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    [self.data setLength:0];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)d {
    [self.data appendData:d];
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    [[[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Error", @"")
                                 message:[error localizedDescription]
                                delegate:nil
                       cancelButtonTitle:NSLocalizedString(@"OK", @"") 
                       otherButtonTitles:nil] autorelease] show];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    NSString *responseText = [[NSString alloc] initWithData:self.data encoding:NSUTF8StringEncoding];

    // Do anything you want with it 

    [responseText release];
}

// Handle basic authentication challenge if needed
- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {
    NSString *username = @"username";
    NSString *password = @"password";

    NSURLCredential *credential = [NSURLCredential credentialWithUser:username
                                                             password:password
                                                          persistence:NSURLCredentialPersistenceForSession];
    [[challenge sender] useCredential:credential forAuthenticationChallenge:challenge];
}

13voto

Roger Points 11711

EDIT: ASIHTTPRequest a été abandonné par le développeur. C'est toujours très bon de l'OMI, mais vous devriez probablement chercher ailleurs maintenant.

Je recommande fortement d'utiliser la bibliothèque ASIHTTPRequest si vous êtes à la manipulation HTTPS. Même sans https, il offre une belle enveloppe pour des trucs comme ça et même s'il n'est pas difficile à faire vous-même sur http normal, je pense juste que la bibliothèque est agréable et une excellente façon de commencer.

Le HTTPS complications sont loin d'être anodines dans les différents scénarios possibles, et si vous voulez être robuste pour le traitement de toutes les variations, vous trouverez les ASI de la bibliothèque d'une réelle aide.

7voto

Jesse Naugher Points 7785

J’ai pensé mettre à jour ce post un peu et dire que beaucoup de la communauté d’iOS a passés à AFNetworking après a été abandonné. Je le recommande fortement. C’est un encapsuleur grand et permet pour les appels asynchrones et fondamentalement n’importe quoi, vous pourriez avoir besoin.

0voto

Salman Iftikhar Points 86

vous pouvez également essayer celui-ci. Si vous utilisez ARC

SIKHttpRequest ARC

0voto

user3057272 Points 1

Ce projet peut être très pratique pour toutes vos données. Il va prendre soin de vos téléchargements et stocker localement. Consultez le lien https://github.com/amitgowda/AGInternetHandler

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X