【问题标题】:How to send correctly a JSON request testing Rails?如何正确发送 JSON 请求测试 Rails?
【发布时间】:2016-06-03 16:28:31
【问题描述】:

我在 Rails 中看到一个奇怪的行为,在发送一个 post 请求时,有以下正文:

如果您检查的是哈希(发送时转换为 JSON)。但是奇怪的是,当控制器中的参数读取时,会这样识别:

如果仔细检查,:first_name:email 的属性会移动到数组中的上一项。

我想如果你有一个数组,在第一个项目上具有某些属性,但在以下项目上有一些不同的属性,那么该数组将尊重设置属性的位置。

我知道答案很可能是“只需将这些属性的nil 或空值放在数组的第一项上”,但我更感兴趣的是为什么会这样。

谢谢。

更新

感谢一个问题,我从浏览器中复制了场景(我最初是从 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 的索引丢失了吗?我发送的数组有误吗?

【问题讨论】:

  • 您是否检查过网络上实际发送的内容(例如,使用 chrome 的网络检查器)?
  • @FrederickCheung 我正在使用 Rails 的测试框架而不是浏览器发出请求。所以我写了post create_team_path, { :format => :json, :team => team } 其中team 是哈希。
  • @FrederickCheung 更新问题的新方法
  • 看起来测试框架的 post 方法正在序列化请求参数,就好像它是正常的非 JSON 数据一样,并且在以某些方式组合数组和散列时确实有限制。不知道你如何让它做一个实际的 JSON 帖子

标签: ruby-on-rails arrays api post params


【解决方案1】:

要发送一个可接受的 json 请求,您需要作为一个形成的字符串而不是散列发送,还要添加标头 您的代码必须如下所示:

post create_team_path, {:team => team}.to_json, 'CONTENT_TYPE' => 'application/json;charset=utf-8'

请注意,问题在于解析器散列到表单请求不添加每个对象的索引

来源:How to post JSON data in rails 3 functional test

【讨论】:

    猜你喜欢
    • 2015-12-22
    • 2015-08-07
    • 2018-01-02
    • 2022-07-05
    • 2015-05-04
    • 2011-08-08
    • 2015-09-23
    • 1970-01-01
    • 2011-06-13
    相关资源
    最近更新 更多