You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Rails中为custom_json格式的所有请求自动添加请求头?

解决Rails 7中自定义:custom_json格式请求的Content-Type与参数解析问题

问题核心

你注册的:custom_json是JSON的MIME类型别名,但POST/PATCH请求未携带Content-Type: application/json时,Rails会默认按表单格式(application/x-www-form-urlencoded)解析请求体,导致JSON字符串被当成单一表单参数,而非结构化哈希。你之前的代码错误修改了响应头,而非请求的Content-Type,因此无法影响参数解析逻辑。

两种有效解决方案

方案一:配置参数解析器(推荐,简洁全局生效)

直接让:custom_json格式复用JSON的参数解析逻辑,无需修改控制器。在config/initializers/mime_types.rb中补充配置:

# 注册自定义MIME类型别名
Mime::Type.register_alias 'application/json', :custom_json
# 让custom_json使用与JSON一致的参数解析器
ActionDispatch::Request.parameter_parsers[:custom_json] = ActionDispatch::Request.parameter_parsers[:json]

这样无论请求的Content-Type是什么,只要请求格式被识别为:custom_json(比如URL后缀.custom_json),Rails就会自动用JSON解析器处理请求体。

方案二:控制器前置回调(适合需自定义逻辑的场景)

通过prepend_before_action确保在参数解析前修改请求的Content-Type,让Rails使用JSON解析器。修改app/controllers/application_controller.rb:

class ApplicationController < ActionController::Base
  # 前置回调优先执行,确保在参数解析前生效
  prepend_before_action :force_custom_json_content_type, if: :custom_json_request?

  private

  def force_custom_json_content_type
    # 将请求的Content-Type强制设为application/json
    request.content_type = Mime[:json].to_s
  end

  def custom_json_request?
    request.format.symbol == :custom_json
  end
end

验证效果

执行你提供的curl命令:

curl "http://192.168.x.x:3000/users/action.custom_json" \
    -X POST \
    -d '{"val":{"var1":"value1","var2":"value2"}}'

此时日志中的参数会被正确解析为结构化哈希:

Started POST "/users/action.custom_json" for 192.168.x.y at 2024-02-16 07:41:04 +0100
Processing by UsersController#create as CUSTOM_JSON
  Parameters: {"val"=>{"var1"=>"value1", "var2"=>"value2"}}

内容的提问来源于stack exchange,提问作者user502052

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 19:22:42