【问题标题】:AFNetworking HTTPClient receiving 406 from a Rails JSON serviceAFNetworking HTTPClient 从 Rails JSON 服务接收 406
【发布时间】:2012-07-13 01:32:19
【问题描述】:

我正在构建一个 iOS 应用程序来使用 Rails 3.x 应用程序提供的 Web 服务;具体来说,我希望收到来自控制器的 JSON 响应,以响应带有此块的简单 GET 请求。

# after some data calls...

respond_to do |format|
  format.json { render :json => some_object }
  format.xml { render :xml => some_object }
end

在我的 iOS 应用程序中,我使用 AFNetworking 库来创建 AFHTTPClient 的子类来使用此服务。当我调用我的 GET 端点时,我收到一个 HTTP 406 错误 - 如果我针对本地运行的 Rails 应用程序运行它,我可以验证这就是发送的内容。它成功运行了所有数据调用,一旦到达respond_to 块,它似乎就死了,我很确定问题出在AFNetworking 正在发送的请求标头中。

这是我的 HTTP 客户端为其标头设置的内容。

[self setDefaultHeader:@"Accept" value:@"application/json"];
[self registerHTTPOperationClass:[AFJSONRequestOperation class]];

我的终点是这个……

http://localhost:3000/api/some_object.json

如果我在浏览器中调用此端点,它渲染得很好。如果我用我的 iOS 应用程序调用它,那么我会得到 406。当我在 Rails 应用程序中设置断点并检查正在通过的标头时,AFNetworking 似乎将request.format 设置为mobile — 即使format 应该是 .json(如 URL 所示)。在我的浏览器中,request.format 应该是 application/json

我尝试在 URL 中的请求中手动设置此 format 选项,作为查询字符串参数...我很难过。没有任何效果。有什么我想念的吗?我需要告诉AFNetworking 用作请求标头以使其正常工作?我很茫然。

【问题讨论】:

    标签: ruby-on-rails ios ruby


    【解决方案1】:

    我刚刚搜索了AFNetworking 源代码,并没有将格式设置为mobile 的地方,该字符串甚至没有出现在源代码中一次。

    这一定发生在 Rails 端。您是否定义了任何移动 Mime::Type 别名?在您的代码中搜索 mobile 以查看结果。对于临时修复,我会重写为

    format.mobile { ... }
    format.json { ... }
    

    【讨论】:

    • 谢谢,@coneybeare,我认为你是对的 - 现在我想起来了,如果它来自 iOS 设备(也许是 mobile_fu;这是另一个开发者的 Rails 应用程序)。我来看看。谢谢指点。
    • 另外,当我输入respond.mobile 时,HTTP 客户端出于某种原因期望接收 HTML。我打赌它是mobile_fu
    • 我拥有的 API 控制器继承自 ApplicationController,上面有 has_mobile_fu 声明。打破继承链修复了它。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多