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