abh*_*and 7 json ruby-on-rails xmlhttprequest http-accept-header
我有一些前端 javascript 向我的后端 rails 服务器发出异步 http 请求。在前端,我没有使用 XHR(我使用axios,尽管这与问题并不完全相关)。
在请求中,我设置了以下内容来告诉服务器我正在发送 JSON 并确保我得到 JSON:
const config = {
headers: {
"Content-Type": "application/json",
"Accept": "application/json"
}
};
Run Code Online (Sandbox Code Playgroud)
在我的后端 Rails 控制器中,如果检查请求,我可以验证Accept标头:
> request.headers
"HTTP_ACCEPT"=>"application/json, text/plain, */*"
Run Code Online (Sandbox Code Playgroud)
然而 ActionPack/Rails 仍然不尊重这一点并默认为format存在:html
> request.format
=> #<Mime::Type:0x00007fe223919f80 @hash=-1773238723920954657, @string="text/html", @symbol=:html, @synonyms=["application/xhtml+xml"]>
Run Code Online (Sandbox Code Playgroud)
这是为什么?
我知道我可以附加.json到我的请求 URL 以“强制”它指定该格式,但这是唯一的选择吗?我可以轻松地附加它,但它似乎是特定于 Rails 的实现,而不是真正的“正确”方法。
此外,该方法的源代码request.format明确设置:json为 XHR 请求的格式 - rails 目前是否只尊重 XHR 请求?
谢谢!
小智 -1
您所做的事情是正确的,但是从浏览器发送 Axios/Fetch API 请求将在浏览器端显示“CORS”错误(您可以在浏览器开发工具控制台中看到它)。您可以通过MDN 文档了解更多信息
要解决此问题,您需要将Access-Control-Allow-Origin标头发送到您在 Web 服务器上收到的请求。您可以通过添加此标头来手动完成此操作application_controller.rb,或者只需使用像rack-cors. 我将向您展示如何使用rack-corsgem:
gem 'rack-cors'您的Gemfilebundle i在您的config/application.rb文件中,添加以下行:
config.middleware.insert_before 0, Rack::Cors do
allow do
origins '*'
resource '*', headers: :any, methods: [:get, :post, :options]
end
end
Run Code Online (Sandbox Code Playgroud)现在重新启动你的rails服务器
现在再次进行 API 调用,无需.json在 URL 末尾强制,它应该可以工作。
| 归档时间: |
|
| 查看次数: |
1748 次 |
| 最近记录: |