AFNetworking: anexa los parameters como la cadena de consulta para la request PUT

En primer lugar, me doy count de que para una request PUT, los parameters de la request deben pasar en el cuerpo de la request. Sin embargo, estoy trabajando con una API (que solo estoy consumiendo, no desarrollando) que espera que los parameters de request se anexen como la cadena de consulta para una request PUT.

Estoy haciendo uso de una subclass de AFHTTPClient. Para la request PUT particular a la que me estoy refiriendo, hago uso de getPath: parameters: success: failure:.

La solución que he encontrado hasta ahora es la construcción manual de la variable de ruta para include los parameters que quiero pasar. Por supuesto, esto no es ideal y me preguntaba si hay otra opción que sea less propensa a errores.

En resumen, ¿hay alguna forma de enviar una request PUT utilizando AFHTTPClient (una subclass de) con los parameters pasados ​​anexados (y codificados) como la cadena de consulta (al igual que una request GET)?

El método getPath: parameters: success: failure dentro de AFHTTPClient.m invoca requestWithMethod: path: parameters. Dentro del último método, el método HTTP se verifica contra ciertos valores para decidir cómo agregar los parameters a la request. Como puede ver, de manera pnetworkingeterminada, los parameters solo deben agregarse a la URL en caso de una request GET, HEAD o DELETE. Como necesita que se anexen a la URL en caso de una request PUT también, modifique the requestWithMethod: path: parameters como este:

- (NSMutableURLRequest *)requestWithMethod:(NSString *)method path:(NSString *)path parameters:(NSDictionary *)parameters { NSURL *url = [NSURL URLWithString:path relativeToURL:self.baseURL]; NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] initWithURL:url] autorelease]; [request setHTTPMethod:method]; [request setAllHTTPHeaderFields:self.defaultHeaders]; if ([method isEqualToString:@"GET"] || [method isEqualToString:@"HEAD"]) { [request setHTTPShouldUsePipelining:YES]; } if (parameters) { if ([method isEqualToString:@"GET"] || [method isEqualToString:@"HEAD"] || [method isEqualToString:@"DELETE"] || [method isEqualToString:@"PUT"]) { url = [NSURL URLWithString:[[url absoluteString] stringByAppendingFormat:[path rangeOfString:@"?"].location == NSNotFound ? @"?%@" : @"&%@", AFQueryStringFromParametersWithEncoding(parameters, self.stringEncoding)]]; [request setURL:url]; } else { NSString *charset = (NSString *)CFStringConvertEncodingToIANACharSetName(CFStringConvertNSStringEncodingToEncoding(self.stringEncoding)); switch (self.parameterEncoding) { case AFFormURLParameterEncoding:; [request setValue:[NSString stringWithFormat:@"application/x-www-form-urlencoded; charset=%@", charset] forHTTPHeaderField:@"Content-Type"]; [request setHTTPBody:[AFQueryStringFromParametersWithEncoding(parameters, self.stringEncoding) dataUsingEncoding:self.stringEncoding]]; break; case AFJSONParameterEncoding:; [request setValue:[NSString stringWithFormat:@"application/json; charset=%@", charset] forHTTPHeaderField:@"Content-Type"]; [request setHTTPBody:[AFJSONStringFromParameters(parameters) dataUsingEncoding:self.stringEncoding]]; break; case AFPropertyListParameterEncoding:; [request setValue:[NSString stringWithFormat:@"application/x-plist; charset=%@", charset] forHTTPHeaderField:@"Content-Type"]; [request setHTTPBody:[AFPropertyListStringFromParameters(parameters) dataUsingEncoding:self.stringEncoding]]; break; } } } return request; } 

Puede hacer lo que hace el código en la respuesta de datwalk sin modificar el código AFNetworking subyacente. Use AFNetworking para crear una ruta que incluya parameters de URL:

 NSDictionary *mutableParameters = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"csv",@"format", @"0",@"level", @"2013-10-25", @"keydate", nil]; NSString *urlPath = [NSString stringWithFormat:@"applications/%@/Planning?%@", name, AFQueryStringFromParametersWithEncoding(mutableParameters, NSUTF8StringEncoding)]; NSString *apiFunctionPath = [urlPath stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; [self putPath:apiFunctionPath parameters:nil success:^(AFHTTPRequestOperation *operation, id XML) { NSLog(@"%@",XML); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"%@",error); }]; 

Para el caso de mi API, cambiar la encoding del object AFHTTPClient resolvió el problema:

 myAFHTTPClient.parameterEncoding = AFJSONParameterEncoding;