Ruby on Rails 6 PUT请求JSON参数未被识别返回400错误如何解决?
问题原因及排查方案
你的日志显示Rails没有拿到请求体中的blog参数,按照以下顺序排查即可定位问题:
1. 优先检查Postman请求配置
90%以上的这类问题都是Postman的请求体配置错误导致的:
- 打开你的PUT请求配置,切换到
Body标签页 - 确认你选中的是raw选项,而非
form-data、x-www-form-urlencoded或者binary - 确认raw选项右侧的格式下拉框选中的是
JSON,而非Text、JavaScript等其他格式 - 检查你填写的JSON内容是否有语法错误,比如多余的逗号、引号不闭合等
配置正确的情况下,你还可以在Postman中点击Code按钮,生成curl请求直接在终端执行,排除Postman自身的bug:
curl -X PUT -H "Content-Type: application/json" -d '{"blog": {"title":"Blog one","content":"Blog 1 Test Sem"}}' https://ror-backend-angular-13.herokuapp.com/blogs/1
2. 检查请求传输链路是否丢失请求体
如果Postman配置完全正确,说明请求在到达Rails控制器之前就丢失了请求体:
- 先本地启动Rails服务,用Postman或上面的curl请求本地地址测试,如果本地请求能正常拿到所有参数,说明是部署环境的问题:
- 检查Heroku是否配置了额外的反向代理、WAF规则拦截了请求体
- 检查你是否在Heroku上启用了会修改请求的第三方插件
- 如果本地也复现问题,检查项目的中间件配置:
- 查看
config/application.rb和config/initializers下的文件,是否有自定义的Rack中间件会提前读取、消费请求体(请求体是IO流,读取一次后默认不会重置,后续解析就会拿到空内容) - 临时移除所有非官方的第三方gem,排查是否是gem导致的请求体拦截
- 查看
3. 检查Rails参数解析配置
如果上面两步都没问题,排查Rails自身的参数解析配置:
- 检查
config/initializers/wrap_parameters.rb是否存在异常配置,默认配置如下即可正常解析JSON参数:
# 默认配置,不需要修改 ActiveSupport.on_load(:action_controller) do wrap_parameters format: [:json] end
- 在
update动作第一行加入日志打印原始请求体,确认Rails有没有拿到请求内容:
def update Rails.logger.info "=== 原始请求体:#{request.raw_post}" # 原有逻辑不变 end
如果日志中能打印你提交的JSON内容,说明参数解析逻辑被修改,检查项目中是否有重写params方法、或者添加了参数过滤的全局逻辑。
内容的提问来源于stack exchange,提问作者Semen Shekhovtsov
相关产品推荐
相关产品推荐

