Comment ajouter des données à un POST
NSURLRequest
existant? J'ai besoin d'ajouter un nouveau paramètre userId=2323
.
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
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];
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.
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]];
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.
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)