如何在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
相关产品推荐
相关产品推荐

