每当我从我的角度前端向我的Rails后端发出API请求时,API调用将被解释为content-type :: html。但是我希望它们被解释为content-type :: json
检查传入请求时,content_type被正确设置为"application/json"
但是request.format的计算结果为:html
17:23:27 web.1 | (rdb:1) request.content_type
17:23:27 web.1 | "application/json"
17:23:31 web.1 | (rdb:1) request.format
17:23:31 web.1 | #<Mime::Type:0x007fb523405d00 @synonyms=["application/xhtml+xml"], @symbol=:html, @string="text/html">
我做错了什么,我应该在客户端强制标题还是我的其中一根棒的错误结束?
我猜Rails正在使用文件结尾来确定所需的格式 - 有没有办法让它尊重标题呢?
答案 0 :(得分:3)
通常,当您想要将Angular应用程序连接到Rails项目时,最佳做法是为所有角度资源创建api命名空间。在您的routes.rb
文件中,您将要执行以下操作:
# Set the default format to json
namespace :api, defaults: {format: :json} do
# Edit and New routes are generally not required for RESTful JSON endpoints
resources :my_json_resources, except: [:edit, :new]
# Other resources
end
然后你可以在没有json扩展名的情况下点击你的路线:/api/my_json_resources/:id
。在路由上设置默认值可确保端点默认返回JSON而不是HTML。这是一个很酷的教程(现在可能有点过时),它向您展示了如何将角度与轨道4进行整合。https://shellycloud.com/blog/2013/10/how-to-integrate-angularjs-with-rails-4
另请注意,Angular文档不建议您设置CSRF标头的部分。为此,请参阅this stack overflow post。
对于Rails路由命名空间最佳做法,请参阅this documentation
答案 1 :(得分:2)
正如@mike所指出的,为应用程序设置一个单独的API命名空间最终是有意义的,其中事物默认为content-type: 'application/json'
。
然而,这对我来说是一个较长期的转变,与此同时,这就是我解决问题的方法。
从this question和this source code可以看出,Rails正在使用Accept
标头来确定实际格式。
在Angular
中设置接受标头很容易editorAppServices.factory('Magazine', ['$resource',
function($resource){
return $resource('magazines/:toParam', {toParam: '@to_param'}, {
query: {
method: 'GET', params:{}, isArray:true
},
save: {
method: 'PUT', headers: { 'Accept': 'application/json' }
}
})
}])
这就是它的全部内容。