iOS 从带有 JSON 参数的 AFNetworking HTTP POST 方法获取 JSON 响应

Posted

技术标签:

【中文标题】iOS 从带有 JSON 参数的 AFNetworking HTTP POST 方法获取 JSON 响应【英文标题】:iOS Get JSON response from AFNetworking HTTP POST method with JSON parameters 【发布时间】:2015-11-20 13:11:40 【问题描述】:

我在https://api.hackerearth.com/codemonk/v1/topic­detail/ 上使用 JSON 参数发布时收到404 错误。服务器使用 POST HTTP 方法来获取topic 的详细信息,成功时会收到 JSON 响应。 POST 参数是topic 对象的id。 POST 参数应采用 JSON 格式。 我正在使用 AFNetworking 如下 -

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.requestSerializer = [AFJSONRequestSerializer serializer];

NSDictionary *params = [NSDictionary dictionaryWithObject:@1 forKey:@"id"];

NSString *str = @"https://api.hackerearth.com/codemonk/v1/topic­-detail/";

NSString *encodedStr = [str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

[manager POST:encodedStr
   parameters:params
      success:^(AFHTTPRequestOperation * _Nonnull operation, id  _Nonnull responseObject) 

    NSLog(@"responseObject : %@",responseObject);


 failure:^(AFHTTPRequestOperation * _Nullable operation, NSError * _Nonnull error) 

    NSLog(@"error : %@", error.localizedDescription);

];

这是常规内容,但不知道为什么我现在似乎无法正确理解。我只收到404 Page Not Found 错误。这肯定不是服务器端问题。有帮助吗?

【问题讨论】:

您设置了 id 值 1 表示该链接; api.hackerearth.com/codemonk/v1/topic-detail/id=1 这个链接给出 404。我错过了什么吗? 这是一个 POST 请求,我需要将 "id":1 作为 json 参数体传递给这个 post 请求。 使用您作为正文提供的 json dict 发送 POST 请求也会产生 404 错误。你能提供文件吗?也许 API 需要一些头文件 您确定您使用的链接正确吗?这似乎是一个服务器端问题。我试图用邮递员运行你的请求,它也给出了相同的结果。 该文档非常标准,这是它的链接:bit.ly/1jb9fLb 【参考方案1】:

也许这会有所帮助。

AFJSONRequestSerializer *requestSerializer = [AFJSONRequestSerializer serializer];

[requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];

operationManagerInstance.requestSerializer = requestSerializer;

=============更新

复制您的网址时出现 404。这是因为主题细节之间的连字符实际上不是连字符。这是一些不起作用的特殊字符。

https://api.hackerearth.com/codemonk/v1/topic-detail/

相反,我删除了它并手动输入连字符,它工作正常。

【讨论】:

曾尝试过这个显式的 json 设置,再次尝试,但仍然收到 404 错误 为了上帝的甜蜜之爱,是的,就是这样,连字符是罪魁祸首——这就是为什么没有一个 POST 请求不起作用的原因(所有这些请求都有连字符)谢谢一个吨队友:) 你的问题让我很开心!这比在 POST 请求正文中发送 JSON 更有趣:)【参考方案2】:

删除下面一行

NSString *encodedStr = [str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

尝试以下方法:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.requestSerializer = [AFJSONRequestSerializer serializer];

NSDictionary *params = [NSDictionary dictionaryWithObject:@1 forKey:@"id"];

NSString *str = @"https://api.hackerearth.com/codemonk/v1/topic­-detail/";

[manager POST:str
   parameters:params
      success:^(AFHTTPRequestOperation * _Nonnull operation, id  _Nonnull responseObject) 

    NSLog(@"responseObject : %@",responseObject);


 failure:^(AFHTTPRequestOperation * _Nullable operation, NSError * _Nonnull error) 

    NSLog(@"error : %@", error.localizedDescription);

];

【讨论】:

以上是关于iOS 从带有 JSON 参数的 AFNetworking HTTP POST 方法获取 JSON 响应的主要内容,如果未能解决你的问题,请参考以下文章

iOS,AFNetworking - 带有 JSON 响应的“清除”NSSTring [关闭]

无法生成带有参数的 get 请求的 json 响应

Android + iOS - 从带有指定参数的 WWW 链接安装 + 运行/运行应用程序

JAVA接口传递参数(POST),从接口接收数据(JSON) -----记录

带有来自 WebService 的会话 ID 的 IOS 登录 JSON 解析器

如何从 python 调用带有 Char** 参数和 int* 参数的 C 方法?