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

Posted

技术标签:

【中文标题】内容类型设置为 application/json 的 Ajax 请求被 Rails 解释为文本【英文标题】:Ajax request with content type set to application/json interpreted by Rails as text 【发布时间】: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 格式的块)。

【问题讨论】:

【参考方案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')
)

【讨论】:

以上是关于内容类型设置为 application/json 的 Ajax 请求被 Rails 解释为文本的主要内容,如果未能解决你的问题,请参考以下文章

无法在 jQuery.ajax 中将内容类型设置为“应用程序/json”

$.ajaxSetup 没有为 Get 请求设置内容类型

如何使用 fetch 发布内容类型为 application/json

无法处理消息,因为内容类型为 'application/json; charset=utf-8' 不是预期的类型 'text/xml;字符集=utf-8'

表单提交返回内容类型为 application/json 而不是 text/html 的响应

HTTP 415 无法处理消息,因为内容类型为 'application/json; charset=utf-8' 不是预期的类型 'text/xml;字符集=utf-8'