【问题标题】:Ajax request with content type set to application/json interpreted by Rails as text内容类型设置为 application/json 的 Ajax 请求被 Rails 解释为文本
【发布时间】:2015-05-29 12:17:27
【问题描述】:

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

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

我正在使用 Backbone:

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

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

请求

  • 内容类型:应用程序/json
  • 接受:应用程序/json,文本/javascript,/; q=0.01
  • cookie 已通过(Cookie:mp_3b2796f7...)
  • 主机:language.com
  • 来源:bonjour.language.com

跨域请求时,csrf token显然没有通过,所以我在服务器上禁用了create action的验证。

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

【问题讨论】:

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


    【解决方案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')
    )
    

    【讨论】:

      猜你喜欢
      • 2012-02-28
      • 2019-08-01
      • 2019-07-17
      • 2012-12-16
      • 2019-03-01
      • 2013-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多