我正在研究一种方法来集中我的URL连接,以便从服务器发送和接收JSON数据。它适用于POST,但不适用于GET。我正在使用Google 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 dev服务器显示“管道损坏”错误,表示客户端在服务器完成所有数据发送之前关闭了连接。
以下是方法:
/* 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。我该如何解决这个问题?
答案 0 :(得分:8)
在我的情况下,我没有调用[request setHTTPMethod:@“POST”]
答案 1 :(得分:2)
我认为根本原因是您的网址无效。
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 Error Codes Reference,错误为kCFErrorHTTPParseFailure。这意味着客户端无法正确解析HTTP响应。
答案 2 :(得分:1)
原因是GET不包含正文。为什么要在GET中提交JSON呢?
如果目标api仅返回数据,则将其传递给url params。
如果你想发送数据和"得到"回复使用帖子并在返回时检查身体。
样本帖子:
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;