31

Estoy escribiendo una aplicación que se conecta con un servidor usando NSURLConnection.¿Cómo puedo obtener el cuerpo NSURLResponse?

En el método de delegado didreceiveresponse, si el código de estado es 404, cancelo la conexión y me gustaría mostrar un mensaje con un error personalizado que se genera en el servidor.

El problema es que desde el objeto de respuesta, solo puedo obtener código de estado, encabezados, tipo MIME, etc. pero no cuerpo.

¿Cómo obtengo el mensaje del cuerpo desde NSURLResponse?

Respuesta

26

¿Por qué cancela la conexión? Después de todo, 404 también puede tener cuerpo de contenido. Simplemente no lo cancele, y deje que el programa llame al próximo delegado NSURLConnection método. Cuando se envían los datos [el cuerpo del contenido] - (void)connection:(NSURLConnection *) didReceiveData:(NSData *), necesita recuperar los datos allí. Read corresponding part in the docs:

La respuesta de un servidor a una solicitud se puede ver como dos partes: metadatos que describen los contenidos y los datos de contenido de URL. Los metadatos que son comunes a la mayoría de los protocolos están encapsulados por la clase NSURLResponse y consisten en el tipo MIME, la longitud del contenido esperado, la codificación de texto (cuando corresponda) y la URL que proporcionó la respuesta.

Las clases NSURLConnection y NSURLDownload proporcionan la interfaz para realizar una conexión especificada por un objeto NSURLRequest y descargar los contenidos. Un objeto NSURLConnection proporciona datos al delegado a medida que se recibe de la fuente de origen, mientras que un objeto NSURLDownload escribe los datos de solicitud directamente en el disco. Ambas clases proporcionan un amplio soporte de delegado para responder a redirecciones, desafíos de autenticación y condiciones de error.

En cuanto a un ejemplo de implementación delegado:

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)theData{ 
    NSLog(@"String sent from server %@",[[NSString alloc] initWithData:theData encoding:NSUTF8StringEncoding]); 

} 
+2

Si estás haciendo una llamada sincrónica, sin embargo, no está utilizando métodos de delegado. Obtienes el resultado de inmediato: [NSURLConnection sendSynchronousRequest: request returningResponse: & error de respuesta: & err] – Oscar

Cuestiones relacionadas