2012-07-13 64 views
0

我正在构建一个iOS应用程序以使用由Rails 3.x应用程序提供的Web服务;具体来说,我期望收到来自控制器的JSON响应,并通过此块响应简单的GET请求。AFNetworking HTTPClient从Rails JSON服务接收406

# after some data calls... 

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

在我的iPhone应用程序,我使用的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.formatapplication/json喜欢它应该。

我试过手动设置这个format选项在我的请求中的URL,作为查询字符串参数...我很难过。什么都没有有什么我失踪?我需要告诉AFNetworking将其用作请求标题以使其起作用?我很茫然。

回答

1

我刚刚搜索了AFNetworking源代码,并且无法将格式设置为mobile,该字符串甚至不会在源中显示一次。

这必须发生在Rails方面。你是否定义了任何移动Mime ::类型别名?搜索您的代码mobile,看看发生了什么。对于一个临时补丁,我只想改写为

format.mobile { ... } 
format.json { ... } 
+0

感谢,@coneybeare,我认为你是正确的 - 现在我想起来了,有可能是另一个插件采取这种格式特性参数的控制,如果它的到来从iOS设备(mobile_fu也许;这是另一个开发者的Rails应用程序)。我会采取甘德。感谢指针。 – 2012-07-13 01:59:55

+0

另外,当我抛出'respond.mobile'时,HTTP客户端由于某种原因期望接收HTML。我打赌它是'mobile_fu'。 – 2012-07-13 03:14:49

+0

我所使用的API控制器是从'ApplicationController'继承而来的,该''Application''上有'has_mobile_fu'声明。打破继承链固定它。谢谢你的帮助! – 2012-07-13 15:17:15