¿Cómo agregas datos a un existente POST
NSURLRequest
? Necesito agregar un nuevo parámetro userId=2323
.
83
¿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
fuente
Todos los cambios en el
NSMutableURLRequest
deben realizarse antes de llamarNSURLConnection
.Veo este problema mientras copio y pego el código anterior y lo ejecuto
TCPMon
y veo que la solicitud es enGET
lugar de la esperadaPOST
.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];
fuente
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 usarloURLQueryAllowedCharacterSet
, 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 usarURLQueryAllowedCharacterSet
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 eliminangeneralDelimitersToEncode
(que incluye los caracteres#
,[
,]
, y@
, pero debido a un error histórico en algunos viejos servidores web, ni?
tampoco/
) ysubDelimitersToEncode
(es decir!
,$
,&
,'
,(
,)
,*
,+
,,
,;
, y=
). Esta es una implementación correcta (aunque podría debatir la eliminación de?
y/
), aunque bastante complicada. QuizásCFURLCreateStringByAddingPercentEscapes
sea más directo / eficiente.fuente
stringByAddingPercentEscapesUsingEncoding:
, perostringByAddingPercentEncodingWithAllowedCharacters:
funciona bien con todos los personajes. Ejemplo:URLString = [URLString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
stringByAddingPercentEncodingWithAllowedCharacters
, pero no puede usarURLQueryAllowedCharacterSet
, 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 usarURLQueryAllowedCharacterSet
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 utilizarCFURLCreateStringByAddingPercentEscapes
.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]];
fuente
El código de ejemplo anterior fue realmente útil para mí, sin embargo (como se indicó anteriormente), creo que debe usar en
NSMutableURLRequest
lugar deNSURLRequest
. En su forma actual, no pude conseguir que respondiera a lasetHTTPMethod
llamada. Cambiar el tipo arregló las cosas de inmediato.fuente
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)
fuente