NSURLConnection的提前打烊GET(NSURLConnection closes ear

2019-06-25 02:29发布

我正在研究一种用于集中从服务器发送和接收JSON数据我的URL连接。 它与POST,但没有得到。 我使用的是谷歌App Engine的服务器和我的电脑上,它会处理POST请求并返回正确的结果(和适当的日志),但我得到以下错误,当我尝试用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}

此外,GAE开发服务器示出了“断管”的错误,指示客户端关闭了连接服务器已发送完所有数据之前。

这里的方法:

/* 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];
}

示例调用是:

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

再次,这可与一个POST而不是GET。 我怎样才能解决这个问题?

Answer 1:

我认为,根本原因是你有一个无效的URL。

JSON编码将包括诸如 '{', '}', '[' 和 ']'。 所有这些都需要进行URL添加到URL编码之前。

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

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

要直接回答你的问题:

据CFNetwork的错误代码参考误差kCFErrorHTTPParseFailure 。 这意味着客户端无法正确解析HTTP响应。



Answer 2:

在我来说,我没有叫[请求setHTTPMethod:@“POST”]



Answer 3:

之所以是一个GET不包括主体。 你为什么要在一个GET反正提交JSON?

如果目标API返回的数据只有你通过它的网址参数。

如果要发送的数据和“得到”响应使用后,检查身体上的回报。

范例POST:

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;


文章来源: NSURLConnection closes early on GET