内容类型设置为 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.com
和 bonjour.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”
如何使用 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'