AFNetworking 将 NSMutableDictionary 作为 POST 发送

Posted

技术标签:

【中文标题】AFNetworking 将 NSMutableDictionary 作为 POST 发送【英文标题】:AFNetworking sending NSMutableDictionary as POST 【发布时间】:2014-12-03 20:06:13 【问题描述】:

我刚开始使用 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)

谢谢..

EDIT1

好的,所以在测试了一点之后,我注意到连接实际上已经通过并且 inte 做了我想做的事情,但它仍然向我显示了错误消息,这意味着仍然会进入失败块。

我认为我的服务器正在发回 text/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];

【问题讨论】:

你的服务器崩溃了。 但是为什么。当我使用 Normal NSURLConnection @Andy 发送它时它工作正常 你发送 application/json 对吗? 是的,我需要在代码中这么说吗? @安迪 RequestSerializer 应该这样做 【参考方案1】:

如果您的服务器没有设置application/jsonContent-Type 标头(或等效项),AFHTTPSessionManager 将失败。理论上,您可以对 AFNetworking acceptableContentTypes 值进行陪审,但更好的是,您应该修复服务器代码以返回适当的 Content-Type 标头。

但是,如果您的服务器以 500 代码响应,那么您有一些更根本的问题,如果没有有关服务器的更多信息(例如代码、有关实施的一些细节等),我们可能无法解决这个问题。

如果您有一个有效的NSURLConnection 示例,我倾向于同时运行该代码以及上述代码,并通过Charles 观察请求。仔细查看请求的差异,问题可能会跳出来。

【讨论】:

感谢查尔斯!我会使用它并查找它 我想我实际上设法改变,以便服务器发送 application/json 代替。我怎么知道,因为转到 url 我可以看到文本字体发生了变化。我下载了 Charles,但我似乎无法让它显示模拟器发出的请求。我看到一些教程,我必须手动放置代理和端口,但我的 ios 模拟器没有我可以按下的 wifi 选项卡?我该如何解决这个@Rob 我在模拟器之前启动它。但是,如果您检查您的模拟器并尝试找到 wifi 选项卡来选择代理和端口。你不会找到它。如果模拟器没有无线选项卡@Rob,我不知道在哪里配置设置 我不知道你对这个 wifi 标签的意思。我从来没有见过,也从来没有做过任何事情。底线,如果 http(即非 SSL),你不必做任何事情。如果使用 SSL,请转到“代理”-“代理设置...”,然后单击 SSL 选项卡。 使用 Charles 进行查找。我看到 post 消息已发送,类型为 html/text。观看了我的服务器代码,发现我忘记更改它发回信息的某些部分。所以有些地方发回了 application/json 和一些部分 html/text,将其全部更改为 application/json 解决了问题。谢谢!! 【参考方案2】:

所以问题在于,使用 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:@"/" ...

应该有效地解决问题。

【讨论】:

没用 :(,post 方法仍然有效,我的数据正在发布和更新,但警报视图仍然显示@Andy

以上是关于AFNetworking 将 NSMutableDictionary 作为 POST 发送的主要内容,如果未能解决你的问题,请参考以下文章

无法将令牌附加到 API 调用(基本身份验证、AFNetworking)

无法使用 AFNetworking 将阵列发布到服务器

AFNetworking 3.0 迁移

AFNetworking 将 NSMutableDictionary 作为 POST 发送

使用 AFNetworking 将图像上传到服务器已损坏

使用 AFNetworking 将 JSON 解析为 NSDictionary