82 votes

Ajouter des données à une requête POST NSURLR

Comment ajouter des données à un fichier existant POST NSURLRequest ? J'ai besoin d'ajouter un nouveau paramètre userId=2323 .

190voto

Simon Lee Points 15481

Si vous ne souhaitez pas utiliser de classes tierces, voici comment définir le corps du message...

NSURL *aUrl = [NSURL URLWithString:@"http://www.apple.com/"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:aUrl
                                         cachePolicy:NSURLRequestUseProtocolCachePolicy
                                     timeoutInterval:60.0];

[request setHTTPMethod:@"POST"];
NSString *postString = @"company=Locassa&quality=AWESOME!";
[request setHTTPBody:[postString dataUsingEncoding:NSUTF8StringEncoding]];

NSURLConnection *connection= [[NSURLConnection alloc] initWithRequest:request 
                                                             delegate:self];

Il suffit d'ajouter votre paire clé/valeur à la chaîne de caractères du message.

16voto

Kevin Points 281

Tous les changements apportés au NSMutableURLRequest doit être effectuée avant d'appeler NSURLConnection .

Je constate ce problème lorsque je copie et colle le code ci-dessus et l'exécute TCPMon et voir que la demande est GET au lieu de l'attendu POST .

NSURL *aUrl = [NSURL URLWithString:@"http://www.apple.com/"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:aUrl
                                     cachePolicy:NSURLRequestUseProtocolCachePolicy
                                 timeoutInterval:60.0];

[request setHTTPMethod:@"POST"];
NSString *postString = @"company=Locassa&quality=AWESOME!";
[request setHTTPBody:[postString dataUsingEncoding:NSUTF8StringEncoding]];

NSURLConnection *connection= [[NSURLConnection alloc] initWithRequest:request 
                                                         delegate:self];

12voto

Rob Points 70987

Les messages précédents sur la formation POST sont en grande partie correctes (ajoutez les paramètres au corps, pas à l'URL). Mais si les données d'entrée risquent de contenir des caractères réservés (espaces, esperluette, signe plus, etc.), vous devrez gérer ces caractères réservés. En d'autres termes, vous devez échapper à l'entrée en pourcentage.

//create body of the request

NSString *userid = ...
NSString *encodedUserid = [self percentEscapeString:userid];
NSString *postString    = [NSString stringWithFormat:@"userid=%@", encodedUserid];
NSData   *postBody      = [postString dataUsingEncoding:NSUTF8StringEncoding];

//initialize a request from url

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPBody:postBody];
[request setHTTPMethod:@"POST"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];

//initialize a connection from request, any way you want to, e.g.

NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];

Où le precentEscapeString est définie comme suit :

- (NSString *)percentEscapeString:(NSString *)string
{
    NSString *result = CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
                                                                                 (CFStringRef)string,
                                                                                 (CFStringRef)@" ",
                                                                                 (CFStringRef)@":/?@!$&'()*+,;=",
                                                                                 kCFStringEncodingUTF8));
    return [result stringByReplacingOccurrencesOfString:@" " withString:@"+"];
}

Note, il y avait un prometteur NSString méthode, stringByAddingPercentEscapesUsingEncoding (maintenant déprécié), qui fait quelque chose de très similaire, mais résistez à la tentation de l'utiliser. Il gère certains caractères (par exemple, le caractère espace), mais pas certains autres (par exemple, l'espacement entre les caractères). + o & caractères).

L'équivalent contemporain est stringByAddingPercentEncodingWithAllowedCharacters mais, encore une fois, ne soyez pas tenté d'utiliser URLQueryAllowedCharacterSet car cela permet également + y & passe sans majuscule. Ces deux caractères sont autorisés dans le cadre plus large de "query", mais si ces caractères apparaissent dans une valeur au sein d'une requête, ils doivent être échappés. Techniquement, vous pouvez soit utiliser URLQueryAllowedCharacterSet pour construire un jeu de caractères mutables et supprimer quelques-uns des caractères qu'ils ont inclus, ou construire votre propre jeu de caractères à partir de zéro.

Par exemple, si vous regardez le site d'Alamofire codage des paramètres ils prennent URLQueryAllowedCharacterSet et ensuite retirer generalDelimitersToEncode (qui comprend les caractères # , [ , ] y @ mais en raison d'un bogue historique dans certains anciens serveurs web, ni l'un ni l'autre ? ni / ) et subDelimitersToEncode (c'est-à-dire ! , $ , & , ' , ( , ) , * , + , , , ; y = ). Il s'agit d'une mise en œuvre correcte (bien que l'on puisse débattre de la suppression de l'option ? y / ), bien qu'assez alambiquée. Peut-être CFURLCreateStringByAddingPercentEscapes est plus directe/efficace.

8voto

Alex Terente Points 9190
 NSURL *url= [NSURL URLWithString:@"https://www.paypal.com/cgi-bin/webscr"];
 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:aUrl
                                                        cachePolicy:NSURLRequestUseProtocolCachePolicy
                                                    timeoutInterval:10.0];
[request setHTTPMethod:@"POST"];
 NSString *postString = @"userId=2323";
[request setHTTPBody:[postString dataUsingEncoding:NSUTF8StringEncoding]];

8voto

David Fulton Points 98

L'exemple de code ci-dessus m'a été très utile, cependant (comme cela a été suggéré ci-dessus), je pense que vous devez utiliser NSMutableURLRequest plutôt que NSURLRequest . Dans sa forme actuelle, je n'ai pas réussi à faire en sorte qu'il réponde à l'appel de l'utilisateur. setHTTPMethod appel. Changer le type a arrangé les choses.

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