gpt4 book ai didi

ruby-on-rails - 为什么 rails 无法识别请求 header 中的 `Accept: application/json`?

转载 作者:行者123 更新时间:2023-12-04 11:36:38 26 4
gpt4 key购买 nike

我有一些前端 javascript 向我的后端 rails 服务器发出异步 http 请求。在前端,我没有使用 XHR(我使用 axios ,尽管这与问题并不完全相关)。

在请求中,我设置了以下内容来告诉服务器我正在发送 JSON 并确保我得到 JSON:

const config = {
headers: {
"Content-Type": "application/json",
"Accept": "application/json"
}
};

在我的后端 Rails Controller 中,如果检查请求,我可以验证 Accept标题:
> request.headers
"HTTP_ACCEPT"=>"application/json, text/plain, */*"

但是 ActionPack/Rails 仍然不尊重这一点并默认为 format正在 :html
> request.format
=> #<Mime::Type:0x00007fe223919f80 @hash=-1773238723920954657, @string="text/html", @symbol=:html, @synonyms=["application/xhtml+xml"]>

这是为什么?

我知道我可以追加 .json到我的请求 URL 以“强制”它指定该格式,但这是唯一的选择吗?我可以轻松地附加它,但它似乎是特定于 Rails 的实现,而不是真正的“正确”方法。

此外, source code for the request.format method显式设置 :json作为 XHR 请求的格式 - rails 目前是否只尊重 XHR 请求?

谢谢!

最佳答案

您所做的是正确的,但是从浏览器发送 Axios/Fetch API 请求将在浏览器端显示“CORS”错误(您可以在浏览器开发工具控制台中看到它)。您可以从 MDN Docs 了解更多信息

要解决此问题,您需要发送 Access-Control-Allow-Origin您在 Web 服务器上收到的请求的 header 。您可以通过在 application_controller.rb 中添加此标题来手动执行此操作或者简单地使用像 rack-cors 这样的 gem .我会告诉你如何使用 rack-cors gem :

  • 添加 gem 'rack-cors'在您的 Gemfile
  • 运行命令 bundle i
  • 在您的 config/application.rb文件,添加以下几行:
    config.middleware.insert_before 0, Rack::Cors do
    allow do
    origins '*'
    resource '*', headers: :any, methods: [:get, :post, :options]
    end
    end
  • 现在重新启动 Rails 服务器
  • 您还可以查看以上说明和更多详细信息 here

  • 现在再次调用 API 而不强制 .json在 URL 的末尾,它应该可以工作。

    关于ruby-on-rails - 为什么 rails 无法识别请求 header 中的 `Accept: application/json`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58021497/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com