AFNetworking将NSMutableDictionary作为POST发送

时间:2014-12-03 20:06:13

标签: objective-c afnetworking-2 http-post

我是使用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];
}

2 个答案:

答案 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:@"/" ...

应该有效地解决问题。