如何正确发送一个JSON请求测试Rails?
How to send correctly a JSON request testing Rails?
我在 Rails 中看到一个奇怪的行为,当发送 post 请求时,正文如下:
如果你检查的是一个Hash(发送时转换为JSON)。但是奇怪的是,当控制器中的参数读取时,被识别为:
如果仔细检查,:first_name
和:email
的属性被移动到数组中的前一项。
我想如果你有一个在第一个项目上有某些属性的数组,但在后面的项目上有一些不同的属性,那么这个数组将尊重属性设置的位置。
我知道答案很可能是 "just put a nil
or empty value of those attributes on the first item of the array",但我更感兴趣的是为什么会这样。
谢谢。
更新
感谢一个问题,我从浏览器复制了场景(我最初是从 rails 的 test
功能请求),并从浏览器检查网络,这是发送的内容:
{
"name": "un nombre",
"team_members": [
{
"user_id": 1,
"team_member_role_id": 4
},
{
"email": "cpamerica@avengers.com",
"first_name": "Cap America",
"team_member_role_id": 4,
"admin": true
},
{
"email": "hulk@avenrgers.com",
"first_name": "Bruce Banner",
"team_member_role_id": 1,
"admin": false
},
{
"email": "ironman@avengers.com",
"first_name": "Tony Stark",
"team_member_role_id": 1,
"admin": false
},
{
"email": "thor@avengers.com",
"first_name": "Thor Hijo de Odín",
"team_member_role_id": 2,
"admin": false
}
]
}
并且有效。所以我专注于如何从测试环境发送信息,这是实际代码:
team = {
:name => 'un nombre',
:team_members => [
{
:user_id => 1,
:team_member_role_id => TeamMemberRole.role_communicator_id
},
{
:email => 'cpamerica@avengers.com',
:first_name => 'Cap America',
:team_member_role_id => TeamMemberRole.role_communicator_id,
:admin => true
},
{
:email => 'hulk@avenrgers.com',
:first_name => 'Bruce Banner',
:team_member_role_id => TeamMemberRole.role_visionary_id,
:admin => false
},
{
:email => 'ironman@avengers.com',
:first_name => 'Tony Stark',
:team_member_role_id => TeamMemberRole.role_visionary_id,
:admin => false
},
{
:email => 'thor@avengers.com',
:first_name => 'Thor Hijo de Odín',
:team_member_role_id => TeamMemberRole.role_developer_id,
:admin => false
}
]
}
post create_team_path, :team => team, :format => :json
request.raw
在控制器中读取的是什么(使用调试器):
team[name]=un+nombre&
team[team_members][][user_id]=1&
team[team_members][][team_member_role_id]=4&
team[team_members][][email]=cpamerica%40avengers.com&
team[team_members][][first_name]=Cap+America&
team[team_members][][team_member_role_id]=4&
team[team_members][][admin]=true&
team[team_members][][email]=hulk%40avenrgers.com&
team[team_members][][first_name]=Bruce+Banner&
team[team_members][][team_member_role_id]=1&
team[team_members][][admin]=false&
team[team_members][][email]=ironman%40avengers.com&
team[team_members][][first_name]=Tony+Stark&
team[team_members][][team_member_role_id]=1&
team[team_members][][admin]=false&
team[team_members][][email]=thor%40avengers.com&
team[team_members][][first_name]=Thor+Hijo+de+Od%C3%ADn&
team[team_members][][team_member_role_id]=2&
team[team_members][][admin]=false&
format=json
知道为什么缺少每个 team_member
的索引吗?我发送的数组有误吗?
要发送可接受的 json 请求,您需要以形成的字符串形式发送而不是散列,同时添加 headers
您的代码必须如下所示:
post create_team_path, {:team => team}.to_json, 'CONTENT_TYPE' => 'application/json;charset=utf-8'
请注意,问题出在 form-request 的解析器哈希中,没有添加每个 object
的索引
我在 Rails 中看到一个奇怪的行为,当发送 post 请求时,正文如下:
如果你检查的是一个Hash(发送时转换为JSON)。但是奇怪的是,当控制器中的参数读取时,被识别为:
如果仔细检查,:first_name
和:email
的属性被移动到数组中的前一项。
我想如果你有一个在第一个项目上有某些属性的数组,但在后面的项目上有一些不同的属性,那么这个数组将尊重属性设置的位置。
我知道答案很可能是 "just put a nil
or empty value of those attributes on the first item of the array",但我更感兴趣的是为什么会这样。
谢谢。
更新
感谢一个问题,我从浏览器复制了场景(我最初是从 rails 的 test
功能请求),并从浏览器检查网络,这是发送的内容:
{
"name": "un nombre",
"team_members": [
{
"user_id": 1,
"team_member_role_id": 4
},
{
"email": "cpamerica@avengers.com",
"first_name": "Cap America",
"team_member_role_id": 4,
"admin": true
},
{
"email": "hulk@avenrgers.com",
"first_name": "Bruce Banner",
"team_member_role_id": 1,
"admin": false
},
{
"email": "ironman@avengers.com",
"first_name": "Tony Stark",
"team_member_role_id": 1,
"admin": false
},
{
"email": "thor@avengers.com",
"first_name": "Thor Hijo de Odín",
"team_member_role_id": 2,
"admin": false
}
]
}
并且有效。所以我专注于如何从测试环境发送信息,这是实际代码:
team = {
:name => 'un nombre',
:team_members => [
{
:user_id => 1,
:team_member_role_id => TeamMemberRole.role_communicator_id
},
{
:email => 'cpamerica@avengers.com',
:first_name => 'Cap America',
:team_member_role_id => TeamMemberRole.role_communicator_id,
:admin => true
},
{
:email => 'hulk@avenrgers.com',
:first_name => 'Bruce Banner',
:team_member_role_id => TeamMemberRole.role_visionary_id,
:admin => false
},
{
:email => 'ironman@avengers.com',
:first_name => 'Tony Stark',
:team_member_role_id => TeamMemberRole.role_visionary_id,
:admin => false
},
{
:email => 'thor@avengers.com',
:first_name => 'Thor Hijo de Odín',
:team_member_role_id => TeamMemberRole.role_developer_id,
:admin => false
}
]
}
post create_team_path, :team => team, :format => :json
request.raw
在控制器中读取的是什么(使用调试器):
team[name]=un+nombre&
team[team_members][][user_id]=1&
team[team_members][][team_member_role_id]=4&
team[team_members][][email]=cpamerica%40avengers.com&
team[team_members][][first_name]=Cap+America&
team[team_members][][team_member_role_id]=4&
team[team_members][][admin]=true&
team[team_members][][email]=hulk%40avenrgers.com&
team[team_members][][first_name]=Bruce+Banner&
team[team_members][][team_member_role_id]=1&
team[team_members][][admin]=false&
team[team_members][][email]=ironman%40avengers.com&
team[team_members][][first_name]=Tony+Stark&
team[team_members][][team_member_role_id]=1&
team[team_members][][admin]=false&
team[team_members][][email]=thor%40avengers.com&
team[team_members][][first_name]=Thor+Hijo+de+Od%C3%ADn&
team[team_members][][team_member_role_id]=2&
team[team_members][][admin]=false&
format=json
知道为什么缺少每个 team_member
的索引吗?我发送的数组有误吗?
要发送可接受的 json 请求,您需要以形成的字符串形式发送而不是散列,同时添加 headers 您的代码必须如下所示:
post create_team_path, {:team => team}.to_json, 'CONTENT_TYPE' => 'application/json;charset=utf-8'
请注意,问题出在 form-request 的解析器哈希中,没有添加每个 object
的索引