2012-06-01 10 views
5

Estoy trabajando en un método para centralizar mis conexiones URL para enviar y recibir datos JSON de un servidor. Funciona con POST, pero no GET. Estoy usando un servidor de Google App Engine y manejaré las solicitudes POST y devolveré los resultados correctos (y registraré adecuadamente), pero recibo el siguiente error cuando pruebo la solicitud con un método GET:NSURLConnection cierra temprano en GET

Error Domain=kCFErrorDomainCFNetwork Code=303 "The operation couldn’t be completed. (kCFErrorDomainCFNetwork error 303.)" UserInfo=0xd57e400 {NSErrorFailingURLKey=http://localhost:8080/api/login, NSErrorFailingURLStringKey=http://localhost:8080/api/login} 

Además, el servidor de desarrollo de GAE muestra un error de "conducto interrumpido", que indica que el cliente cerró la conexión antes de que el servidor terminara de enviar todos los datos.

Aquí está el método:

/* Connects to a given URL and sends JSON data via HTTP request and returns the result of the request as a dict */ 
- (id) sendRequestToModule:(NSString*) module ofType:(NSString*) type function:(NSString*) func params:(NSDictionary*) params { 

    NSString *str_params = [NSDictionary dictionaryWithObjectsAndKeys:func, @"function", params, @"params", nil]; 
    NSString *str_url = [NSString stringWithFormat:@"%@%@", lds_url, module]; 

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:str_url]]; 
    NSData *data = [[NSString stringWithFormat:@"action=%@", [str_params JSONString]] dataUsingEncoding:NSUTF8StringEncoding]; 
    [request setHTTPMethod:type]; 
    [request setHTTPBody:data]; 
    [request setValue:[NSString stringWithFormat:@"%d", [data length]] forHTTPHeaderField:@"Content-Length"]; 
    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 

    NSError *error = nil; 
    NSURLResponse *response = nil; 
    NSData *result = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 

    NSLog(@"Error: %@", error); 
    NSLog(@"Result: %@", [[NSString alloc] initWithData:result encoding:NSUTF8StringEncoding]); 
    return [result objectFromJSONData]; 
} 

Una llamada de ejemplo sería:

NSDictionary *response = [fetcher sendRequestToModule:@"login" ofType:@"GET" function:@"validate_email" params:dict]; 

Una vez más, esto funciona con un POST, pero no un GET. ¿Cómo puedo arreglar esto?

Respuesta

2

Creo que la causa raíz es que tiene una URL no válida.

La codificación JSON incluirá elementos como '{', '}', '[' y ']'. Todos estos deben estar codificados en la URL antes de agregarse a una URL.

NSString *query = [NSString stringWithFormat:@"?action=%@", [str_params JSONString]]; 
query = [query stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 

NSURL *URL = [NSURL URLWithString:[NSString stringWithFormat:@"%@%@", str_url, query]]; 

para responder directamente a su pregunta:

Según CFNetwork Error Codes Reference el error es kCFErrorHTTPParseFailure. Esto significa que el cliente no pudo analizar correctamente la respuesta HTTP.

+0

voy a tratar de eso, gracias! – drodman

1

La razón es que un GET no incluye un cuerpo. ¿Por qué querrías enviar JSON en un GET de todos modos?

Si la API de destino solo devuelve datos, debe pasarlos en los parámetros de la URL.

Si desea enviar datos y obtener una respuesta, use una publicación y examine el cuerpo a la vuelta.

Muestra de la publicación:

NSError *error; 
NSString *urlString = [[NSString alloc] initWithFormat:@"http://%@:%@/XXXX/MVC Controller Method/%@",self.ServerName, self.Port, sessionId ]; 
NSURL *url = [NSURL URLWithString:[urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding ]]; 
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 
[request setHTTPMethod:@"POST"]; 

// hydrate the remote object 
NSString *returnString = [rdc JSONRepresentation]; 
NSData *s10 = [returnString dataUsingEncoding:NSUTF8StringEncoding]; 
[request setHTTPBody:s10]; 
NSURLResponse *theResponse = [[NSURLResponse alloc] init]; 
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&theResponse error:&error]; 
NSString *message = [[NSString alloc] initWithFormat: @"nothing"]; 

if (error) { 
    message = [[NSString alloc] initWithFormat:@"Error: %@", error]; 


} else { 
    message = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 

} 

NSLog(@"%@", message); 

return message; 
8

En mi caso yo no estaba llamando [Solicitud setHTTPMethod: @ "POST"]

+0

No estaba especificando un GET o POST que me condujo a este error. Especificar GET me lo arregló. – njtman