web-dev-qa-db-fra.com

Ajouter des données à un POST NSURLRequest

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

82
Tim

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

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];

Ajoutez simplement votre paire clé/valeur à la chaîne de publication

190
Simon Lee

Toutes les modifications apportées à NSMutableURLRequest doivent être effectuées avant d'appeler NSURLConnection.

Je vois ce problème lorsque je copie et colle le code ci-dessus, puis que je lance TCPMon et que je vois que la demande est GET à la place du POST attendu.

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];
16
Kevin

Les publications précédentes sur la formation des requêtes POST sont en grande partie correctes (ajoutez les paramètres au corps, pas à l'URL). Toutefois, s’il existe une chance que les données d’entrée contiennent des caractères réservés (espaces, esperluette, signe plus, par exemple), vous souhaiterez gérer ces caractères réservés. À savoir, vous devriez échapper l'entrée pour cent.

//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ù la méthode precentEscapeString est définie comme suit:

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

Notez qu'il y avait une méthode prometteuse NSString, stringByAddingPercentEscapesUsingEncoding (maintenant obsolète), qui fait quelque chose de très similaire, mais résiste à la tentation de l'utiliser. Il gère certains caractères (par exemple le caractère espace), mais pas certains autres (par exemple le + ou & personnages).

L'équivalent contemporain est stringByAddingPercentEncodingWithAllowedCharacters, mais encore une fois, ne soyez pas tenté d'utiliser URLQueryAllowedCharacterSet, car cela permet également à + et & passer sans échapper. Ces deux caractères sont autorisés dans la "requête" plus large, mais si ces caractères apparaissent dans une valeur dans une requête, ils doivent être échappés. Techniquement, vous pouvez utiliser URLQueryAllowedCharacterSet pour créer un jeu de caractères mutable et supprimer quelques-uns des caractères qu’ils ont inclus, ou créer votre propre jeu de caractères à partir de rien.

Par exemple, si vous regardez le encodage de paramètre d'Alamofire, ils prennent URLQueryAllowedCharacterSet puis supprimez generalDelimitersToEncode (qui inclut les caractères #, [, ], et @, mais à cause d’un bogue historique sur certains anciens serveurs Web, ni ? ni /) et subDelimitersToEncode (c.-à-d. !, $, &, ', (, ), *, +, ,, ;, et =). Ceci est une implémentation correcte (bien que vous puissiez débattre de la suppression de ? et /), bien que très compliqué. Peut-être que CFURLCreateStringByAddingPercentEscapes est plus direct/efficace.

11
Rob
 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]];
8
Alex Terente

Cependant, l'exemple de code ci-dessus m'a été vraiment utile (comme on l'a laissé entendre plus haut), vous devez utiliser NSMutableURLRequest plutôt que NSURLRequest. Dans sa forme actuelle, je ne pouvais pas le faire répondre à l'appel setHTTPMethod. Changer le type corrige tout.

8
David Fulton

Toute personne recherchant une solution Swift

let url = NSURL(string: "http://www.Apple.com/")
let request = NSMutableURLRequest(URL: url!)
request.HTTPBody = "company=Locassa&quality=AWESOME!".dataUsingEncoding(NSUTF8StringEncoding)
1
spaceMonkey