如何让我的Angular请求被Rails处理为format = JSON?

时间:2014-06-02 16:27:15

标签: ruby-on-rails angularjs

每当我从我的角度前端向我的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正在使用文件结尾来确定所需的格式 - 有没有办法让它尊重标题呢?

2 个答案:

答案 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'

然而,这对我来说是一个较长期的转变,与此同时,这就是我解决问题的方法。

Rails从'Accept'标题

确定格式

this questionthis source code可以看出,Rails正在使用Accept标头来确定实际格式。

您可以在Angular

中轻松设置接受标头

在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' }
      }
    })
  }])

这就是它的全部内容。