内容类型设置为application / json的Ajax请求由Rails解释为文本

时间:2015-03-25 17:17:39

标签: ruby-on-rails ruby-on-rails-4 backbone.js cross-domain cors

我有2个域:language.combonjour.language.com

我想从POST向根域发出bonjour.language.com请求。

我使用的是Backbone:

model.save(null,
  xhrFields:
    withCredentials: true
)

我看到了预检请求,然后是实际请求。

请求

  • 内容类型:应用/ JSON
  • 接受:application / json,text / javascript, / ; Q = 0.01
  • 传递cookie(Cookie:mp_3b2796f7 ...)
  • 主机:language.com
  • 原产地:bonjour.language.com

当请求是跨域时,显然没有传递csrf令牌,因此我在服务器上禁用了创建操作的验证。

在控制器中,当我记录request.format时,我得到text/html任何想法为什么? (响应是406不可接受,因为我没有处理html格式的块)。

1 个答案:

答案 0 :(得分:1)

找到解决方案,这很具有讽刺意味。

以下是最终工作的内容:

model.save(null,
  xhrFields:
    withCredentials: true
  crossDomain: false
)

crossDomain: false是否有跨域请求?奇怪吧?

这会诱使jQuery将X-Requested-with标头集发送到XMLHttpRequest。

默认情况下,跨域请求没有设置。

但是Rails必须知道请求是XMLHttpRequest,因此它可以使用内容类型来设置请求格式!

另一种更长但可能更明确的方法是自己设置标题:

model.save(null,
  xhrFields:
    withCredentials: true
  beforeSend: (request) ->
    request.setRequestHeader('X-Requested-with', 'XMLHttpRequest')
)