【问题标题】:Rails: ActionDispatch::Request.parameter_parsers for multipart/form-dataRails:ActionDispatch::Request.parameter_parsers for multipart/form-data
【发布时间】:2017-07-14 06:59:01
【问题描述】:

在我的 Rails API 中,我添加了一个初始化程序,它将 JSON 输入的键从蛇形大小写更改为下划线分隔。像这样:

ActionDispatch::Request.parameter_parsers[:json] = -> (raw_post) {
    data = ActiveSupport::JSON.decode(raw_post)
    data = {:_json => data} unless data.is_a?(Hash)

    data.deep_transform_keys!(&:underscore)
}

现在,某些 API 将使用标头传递:content-type: multipart/form-data 而不是 application/json

我想对此类 API 做同样的事情。那就是添加一个初始化器,它将转换参数中键的大小写。

我试过ActionDispatch::Request.parameter_parsers[:form_data],但它不起作用。

我怎样才能做到这一点?

【问题讨论】:

  • 你解决了吗?我按照以下答案中的建议添加了一个解析器,但它打开了一罐蠕虫:(
  • 是的,我做到了。嗯,有点。我无法使用parameters_parsers 使其工作。它只是不适用于 JSON 参数。让我通过将其添加为答案来向您展示我的代码。

标签: ruby-on-rails rails-api


【解决方案1】:

当您查看DEFAULT_PARSERS 时,它使用Mime 类,因此我们最终使用的任何东西都可能需要Mime 类识别。所以我们可以检查Mime::Types 看看有什么可用的。

在该页面上,我们看到content-type: multipart/form-data 映射到:multipart_form。确实,在使用时

ActionDispatch::Request.parameter_parsers[:multipart_form] = -> (raw_post) {
  raise "Parsing Parameters: #{raw_post}"
}

然后提交带有文件字段的表单,我可以触发错误。

【讨论】:

    【解决方案2】:

    尽管根据 Simple Lime 的回答,:multipart_form 是默认解析器的正确键,用于处理带有 content-type: multipart/form-data 的请求,但它不像 JSON 那样工作。

    这是我实施的解决方法:

    class ApplicationController < ActionController::API
        before_action :transform_params_if_multipart!
    
        private 
        def transform_params_if_multipart!
            params.deep_transform_keys!(&:underscore) if /^multipart\/form-data*/.match(request.headers['content-type'])
        end
    end
    

    【讨论】:

    • 此解决方案适用于带有弃用警告的 Rails 5,但 Rails 5.1 删除了 deep_transform_keys!来自params,所以这不是一个好的长期解决方案,我们可能需要修改ActionDispatch::Request.parameter_parsers[:multipart_form] = -&gt; (raw_post) {
    猜你喜欢
    • 2017-05-05
    • 2021-04-22
    • 2011-03-17
    • 2015-09-19
    • 2013-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多