簡體   English   中英

為什么 Rails 無法識別請求 header 中的 `Accept: application/json`?

[英]Why does rails not recognize `Accept: application/json` in the request header?

我有一些前端 javascript 向我的后端 rails 服務器發出異步 http 請求。 在前端我沒有使用 XHR(我使用axios ,盡管這與問題並不完全相關)。

在請求中,我設置以下內容來告訴服務器我正在發送 JSON 並確保我得到 JSON 回來:

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

在我的后端 Rails controller 如果檢查請求我可以驗證Accept header:

> 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"]>

這是為什么?

我知道我可以 append .json對我的請求 URL “強制”指定該格式,但這是唯一的選擇嗎? 我可以很容易地 append ,但它似乎是特定於 Rails 的實現,而不是真正的“正確”方法。

此外, request.format方法的源代碼明確將:json設置為 XHR 請求的格式——rails 目前是否只考慮 XHR 請求?

謝謝!

您所做的是正確的,但是從瀏覽器發送 Axios/Fetch API 請求將從瀏覽器端顯示“CORS”錯誤(您可以在瀏覽器開發工具控制台中看到它)。 你可以從MDN Docs了解更多

要解決此問題,您需要將Access-Control-Allow-Origin Header 發送到您在 web 服務器上收到的請求。 您可以通過在application_controller.rb中添加這個 header 手動完成,或者只需使用像rack-cors這樣的 gem。 我將向您展示如何使用rack-cors gem:

  • 在您的Gemfile中添加gem 'rack-cors'
  • 運行命令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 服務器

  • 您還可以在此處查看上述說明和更多詳細信息

現在再次調用 API 而不在 URL 的末尾強制.json並且它應該可以工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM