example ios json rest get afnetworking-2

ios - afnetworking example



¿Cómo hacer una solicitud GET codificada JSON con AFNetworking-2.0? (2)

El razonamiento detrás del comportamiento de AFNetworking aquí probablemente se explica de manera más concisa en la pregunta sobre desbordamiento de pila, HTTP GET con cuerpo de solicitud . Una de esas respuestas cita a Ray Fielding :

... En otras palabras, cualquier mensaje de solicitud HTTP puede contener un cuerpo de mensaje y, por lo tanto, debe analizar los mensajes teniendo esto en cuenta. Sin embargo, la semántica del servidor para GET está restringida, de modo que un cuerpo, si lo hay, no tiene ningún significado semántico para la solicitud. Los requisitos para el análisis son independientes de los requisitos de la semántica de los métodos.

Entonces, sí, puedes enviar un cuerpo con GET, y no, nunca es útil hacerlo.

La especificación HTTP / 1.1 define GET para "recuperar cualquier información (en la forma de una entidad) identificada por Request-URI" y no contempla que la información se incluya en el cuerpo de la solicitud. Por lo tanto, el uso del cuerpo en la solicitud GET técnicamente podría no estar prohibido, pero, en el mejor de los casos, no es estándar. La elección de AFNetworking de no apoyarlo no es del todo sorprendente.

Por lo tanto, es posible que no desee incluir JSON en el cuerpo para las solicitudes GET . Uno generalmente agregaría los parámetros a la URL. Si desea enviar JSON en el cuerpo de la solicitud, realice una POST .

Estoy intentando usar un patrón similar a este post que describe hacer un PUT / POST para la API RESTful , pero para un GET.

Mi código original se ve casi igual, excepto que usé una palabra clave GET: Rápidamente descubrí que, en lugar de enviar un cuerpo JSON, en cambio, url codifica los parámetros. Esto no se menciona en la documentación de la clase AFJSONSerializer . AFHTTPSerializer ir a la documentación de la superclase ( AFHTTPSerializer ) y leer sus propiedades, donde encontrará la de HTTPMethodsEncodingParametersInURI . Por defecto, ese conjunto se completa con HEAD, GET y DELETE. Entonces, para esos tipos de solicitudes, el serializador JSON aparentemente revierte a su clase padre por el comportamiento?

Así que armé el siguiente código:

AFHTTPSessionManager* manager = [AFHTTPSessionManager manager]; manager.securityPolicy.allowInvalidCertificates = YES; manager.requestSerializer = [AFJSONRequestSerializer serializer]; manager.requestSerializer.HTTPMethodsEncodingParametersInURI = [NSSet set]; [manager.requestSerializer setAuthorizationHeaderFieldWithUsername: currentUser() password: currentPassword()]; [manager GET: @"https://172.16.214.214:44321/trees" parameters: [NSDictionary dictionary] success:^(NSURLSessionDataTask* task, id responseObject){ NSLog(@"Response: %@", responseObject);} failure:^(NSURLSessionDataTask* task, NSError* error){ NSLog(@"Error: %@", error);}];

La línea que establece HTTPMethodsEncodingParametersInURI = [NSSet set] está destinada a permitirme obtener los parámetros codificados JSON como yo quería para el GET también. Desafortunadamente, no veo nada en el servidor cuando uso esto y obtengo lo siguiente en mi consola de error:

2013-12-10 10:11:14.149 myValve[957:60b] Error: Error Domain=NSURLErrorDomain Code=-1005 "The network connection was lost." UserInfo=0x17e5d4b0 {NSErrorFailingURLStringKey=https://172.16.214.214:44321/trees, NSErrorFailingURLKey=https://172.16.214.214:44321/trees, NSLocalizedDescription=The network connection was lost., NSUnderlyingError=0x17e53240 "The network connection was lost."}

¿Qué sigo perdiendo?


Parece que no se puede conectar al servidor, ¿has intentado realizar una llamada fuera de iOS?

Como referencia, normalmente hago una solicitud JSON como esta:

NSURL *url = @"https://172.16.214.214:44321/trees"; NSData* data = [NSData dataWithContentsOfURL: url]; NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];