【问题标题】:How does rails determine incoming request format?rails 如何确定传入的请求格式?
【发布时间】:2011-09-09 09:02:00
【问题描述】:

我只是想知道 rails 是如何知道请求的格式以正确输入著名的:

respond_to do |format|
  format.html
  format.xml
  format.json
end

作为一个例子,考虑一下我所面临的这种情况。假设通过 javascript(使用 jQuery)我发出一个明确 dataType: json

的 POST 请求
$.ajax({
      type: 'POST',
      url: 'example.com',
      data: data,
      dataType: 'json'
    });

当这个请求到达控制器动作时,用 ruby​​ 调试器站在它里面,我检查@request.format,我可以看到内容类型是 application/json。然后控制器按预期响应 json 格式。

但我对路线中指定的格式符号感到困惑。假设向 example.com/parts.json 发出请求,但请求中的内容类型是 application/html 或 application/xml。 控制器是响应json格式还是html或xml??

谢谢!

【问题讨论】:

    标签: ruby-on-rails controller format


    【解决方案1】:

    来自ActionController::MimeResponds:“Rails 根据客户端提交的 HTTP Accept 标头确定所需的响应格式。”

    【讨论】:

    • 谢谢!但是我还不能理解 :format 出现在 routes.rb 中的符号是什么意思。因为如果我向我的服务器发送请求(例如 GET /entities.xml)并且在我的控制器中我有一个 xml respond_to 处理程序,则接受标头在 google chrome 检查器中显示 application/XML。中间有一些我还没有理解的东西。 rack 是在 url 中看到 .xml 的那个,并且根据这个它构建了带有适当接受标头的适当 REQUEST 吗?再次感谢!
    • 基本上 :xml 是这里注册的 mime 类型之一github.com/rails/rails/blob/master/actionpack/lib/… 这是您将 mime 类型与 :format 符号连接的地方。该符号用于调用适当的渲染器,该渲染器在 ActionController::Renderers 中注册。
    【解决方案2】:

    传入的Content-Type 只影响解析请求的方式。它不影响响应格式。

    Since Rails 5.0,响应格式通过检查来确定:

    1. format 参数(例如/url?format=xml
    2. HTTP Accept 标头(例如 Accept: application/json
    3. 路径扩展名(例如/url.html

    您可以在ActionDispatch::Http::MimeNegotation#formats 的实现中看到这一点。以下是 Rails v6.1 的摘录:

    if params_readable?
      Array(Mime[parameters[:format]])
    elsif use_accept_header && valid_accept_header
      accepts
    elsif extension_format = format_from_path_extension
      [extension_format]
    elsif xhr?
      [Mime[:js]]
    else
      [Mime[:html]]
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多