我是使用AFNetworking的新手。我设法让GET请求在堆栈溢出中得到一个好人的帮助。
现在我陷入了发出POST请求。我尝试这个代码,但我总是在失败的块中。怎么样?
-(void) postEventInfo: (NSMutableDictionary *) eventInfoObject{
NSURL *url = [NSURL URLWithString:string];
AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:url];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
manager.responseSerializer = [AFJSONResponseSerializer serializer];
[manager POST:string parameters:eventInfoObject success:^(NSURLSessionDataTask *task, id responseObject) {
NSLog(@"JSON: %@", responseObject);
//here is place for code executed in success case
} failure:^(NSURLSessionDataTask *task, NSError *error) {
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error while sending POST"
message:@"Sorry, try again."
delegate:nil
cancelButtonTitle:@"Ok"
otherButtonTitles:nil];
[alertView show];
NSLog(@"Error: %@", [error localizedDescription]);
}];
}
我收到以下错误消息:
错误:请求失败:内部服务器错误(500)
日Thnx ..
EDIT1
好的,所以经过多次测试后,我注意到连接实际上已经通过,而inte做了我想做的事情,但它仍然显示错误信息意味着仍然会进入故障块。
我认为我的服务器正在发回文本/ HTML,这可能与此有关吗?
该部分是NSURLConnection工作
EDIT2
NSError *error;
NSData *event = [NSJSONSerialization dataWithJSONObject:eventInfoObject
options:NSJSONWritingPrettyPrinted
error:&error];
if (! event) {
NSLog(@"Got an error: %@", error);
} else {
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setHTTPMethod:@"POST"];
[request setHTTPBody:event];
[request setValue:[NSString stringWithFormat:@"%lu", (unsigned long)[event length]] forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setURL:[NSURL URLWithString:string]];
NSURLConnection *conn = [[NSURLConnection alloc]initWithRequest:request delegate:self];
[conn start];
}
答案 0 :(得分:1)
如果您的服务器未设置Content-Type
application/json
标头(或等效标题),则AFHTTPSessionManager
将失败。理论上,您可以审核AFNetworking acceptableContentTypes
值,但更好的是,您应该修复服务器代码以返回相应的Content-Type
标头。
但是如果您的服务器使用500代码进行响应,那么您会遇到一些更基本的问题,如果没有关于服务器的更多信息(例如代码,有关实现的一些细节等),我们就无法解决这个问题。 )。
如果您有一个有效的NSURLConnection
示例,我倾向于同时运行该代码以及上述代码,并通过Charles观察请求。仔细查看请求中的差异,问题可能会突然发生在您身上。
答案 1 :(得分:0)
问题是,使用AFNetworking,您可以为HTTP管理器设置基本URL,例如
http://api.example.com/
但是当你发布请求时,你使用端点(相对于基本URL的路径)而不是绝对URL,例如
[manager POST:@"users/add" ...
哪个AFNetworking会自动转换为舞台背后的绝对URL:
http://api.example.com/users/add
这显然是为了方便构建API客户端,这就是POST,GET和其他方法采用字符串参数而不是NSURL的原因。
在您的特定情况下更改
[manager POST:string ...
到
[manager POST:@"/" ...
应该有效地解决问题。