¿Cómo agregas datos a un existente POST
NSURLRequest
? Necesito agregar un nuevo parámetro userId=2323
.
Respuestas:
Si no desea utilizar clases de terceros, lo siguiente es cómo configura el cuerpo de la publicación ...
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];
Simplemente agregue su par clave / valor a la cadena de publicación
Todos los cambios en el NSMutableURLRequest
deben realizarse antes de llamar NSURLConnection
.
Veo este problema mientras copio y pego el código anterior y lo ejecuto TCPMon
y veo que la solicitud es en GET
lugar de la esperada 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];
Las publicaciones anteriores sobre la formación de POST
solicitudes son en gran parte correctas (agregue los parámetros al cuerpo, no la URL). Pero si existe la posibilidad de que los datos de entrada contengan caracteres reservados (por ejemplo, espacios, ampersand, signo más), entonces querrá manejar estos caracteres reservados. Es decir, debe escapar por ciento de la entrada.
//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];
Donde el precentEscapeString
método se define como sigue:
- (NSString *)percentEscapeString:(NSString *)string
{
NSString *result = CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
(CFStringRef)string,
(CFStringRef)@" ",
(CFStringRef)@":/?@!$&'()*+,;=",
kCFStringEncodingUTF8));
return [result stringByReplacingOccurrencesOfString:@" " withString:@"+"];
}
Tenga en cuenta que había un NSString
método prometedor , stringByAddingPercentEscapesUsingEncoding
(ahora en desuso), que hace algo muy similar, pero resista la tentación de usarlo. Maneja algunos caracteres (por ejemplo, el carácter de espacio), pero no algunos de los otros (por ejemplo, los caracteres +
o &
).
El equivalente contemporáneo es stringByAddingPercentEncodingWithAllowedCharacters
, pero, de nuevo, no se sienta tentado a usarlo URLQueryAllowedCharacterSet
, ya que eso también permite +
y &
pasa sin escapatoria. Esos dos caracteres están permitidos dentro de la "consulta" más amplia, pero si esos caracteres aparecen dentro de un valor dentro de una consulta, deben ser de escape. Técnicamente, puede usar URLQueryAllowedCharacterSet
para construir un conjunto de caracteres mutable y eliminar algunos de los personajes que han incluido allí, o crear su propio conjunto de caracteres desde cero.
Por ejemplo, si nos fijamos en la Alamofire parámetro de codificación , toman URLQueryAllowedCharacterSet
y luego se eliminan generalDelimitersToEncode
(que incluye los caracteres #
, [
, ]
, y @
, pero debido a un error histórico en algunos viejos servidores web, ni ?
tampoco /
) y subDelimitersToEncode
(es decir !
, $
, &
, '
, (
, )
, *
, +
, ,
, ;
, y =
). Esta es una implementación correcta (aunque podría debatir la eliminación de ?
y /
), aunque bastante complicada. Quizás CFURLCreateStringByAddingPercentEscapes
sea más directo / eficiente.
stringByAddingPercentEscapesUsingEncoding:
, pero stringByAddingPercentEncodingWithAllowedCharacters:
funciona bien con todos los personajes. Ejemplo: URLString = [URLString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
stringByAddingPercentEncodingWithAllowedCharacters
, pero no puede usar URLQueryAllowedCharacterSet
, ya que eso incluye +
y &
(esos son caracteres permitidos dentro de la consulta más amplia, pero si esos caracteres aparecen dentro de un valor dentro de una consulta, deben escapar, lo que ese conjunto de caracteres no hará ). Por lo tanto, puede usar URLQueryAllowedCharacterSet
para construir un conjunto de caracteres mutable y eliminar algunos de los personajes que han incluido allí, o crear su propio conjunto de caracteres desde cero. O utilizar CFURLCreateStringByAddingPercentEscapes
.
CFURLCreateStringByAddingPercentEscapes
ahora está en desuso, debería crear el juego de caracteres apropiado usted mismo. Consulte stackoverflow.com/a/54742187/1271826 .
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]];
El código de ejemplo anterior fue realmente útil para mí, sin embargo (como se indicó anteriormente), creo que debe usar en NSMutableURLRequest
lugar de NSURLRequest
. En su forma actual, no pude conseguir que respondiera a la setHTTPMethod
llamada. Cambiar el tipo arregló las cosas de inmediato.
Cualquiera que busque una solución rápida
let url = NSURL(string: "http://www.apple.com/")
let request = NSMutableURLRequest(URL: url!)
request.HTTPBody = "company=Locassa&quality=AWESOME!".dataUsingEncoding(NSUTF8StringEncoding)