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

Rails集成测试POST请求适配jsonapi-resources失败求助

解决Rails集成测试中jsonapi-resources POST请求的内容类型问题

问题根源

你遇到的问题核心有两点:

  1. Rails默认未注册:api_json对应的MIME类型,导致使用as: :api_json时,Rails无法正确将参数序列化为JSON格式,反而采用了表单URL编码,被jsonapi-resources的严格校验拒绝。
  2. 使用as: :json时,Rails会自动把Accept头设为application/json,但jsonapi-resources要求所有请求的Accept头必须是application/vnd.api+json,因此触发了406错误。

解决方案

步骤1:注册:api_json MIME类型

在你的Rails项目中,创建或修改config/initializers/mime_types.rb文件,添加以下代码:

Mime::Type.register "application/vnd.api+json", :api_json

这会告诉Rails,:api_json对应的内容类型是application/vnd.api+json,后续使用as: :api_json时就能正确处理参数序列化。

步骤2:更新测试代码,设置正确请求头

修改POST测试方法,同时指定as: :api_json和符合要求的Accept头:

test 'should create event' do
  assert_difference('Event.count') do
    post events_url, 
         params: { data: { type: 'events', attributes: { name: @event.name, body: @event.body } } },
         as: :api_json,
         headers: { 'Accept' => 'application/vnd.api+json' }
  end
  assert_response 201
end

替代方案(无需注册MIME类型)

如果不想额外注册MIME类型,也可以直接手动设置Content-Type和Accept头,同时用as: :json确保参数被序列化为JSON:

test 'should create event' do
  assert_difference('Event.count') do
    post events_url, 
         params: { data: { type: 'events', attributes: { name: @event.name, body: @event.body } } },
         headers: { 
           'Content-Type' => 'application/vnd.api+json',
           'Accept' => 'application/vnd.api+json'
         },
         as: :json
  end
  assert_response 201
end

验证说明

  • 第一种方案通过注册MIME类型,让Rails原生支持:api_json的序列化和内容类型映射,同时手动指定Accept头满足jsonapi-resources的校验规则。
  • 第二种方案绕过自定义MIME类型的注册,直接强制设置两个关键请求头,并用as: :json保证参数被正确序列化为JSON格式。

两种方法都能解决你遇到的400和406错误,让POST请求完全符合jsonapi-resources的规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:08:32