使用rest客户端验证JSON响应

时间:2017-10-26 19:40:43

标签: json ruby automated-tests cucumber rest-client

我正在尝试使用ruby中的rest客户端来解析json,但我不知道如何验证响应(从响应中提取值)。此外,我试图验证有效的响应代码(200)response.code不起作用。 以下是使用rest客户端获取它的JSON响应和代码:

def self.call_legacy_transactions

  get_response=RestClient::Request.execute(method: :get, url: 'URL', timeout: 15)
  puts(get_response.body)
  json_response = JSON.parse(get_response)
//Dont know how to get the values from response hash. Please suggest

  end

JSON响应:

    [
  {
    "value": "12345678912345",
    "events": [
      {
        "transaction_id": 205,
        "package_name": "",
        "event_codes": [
          465,
          469,
          471,
          474,
          410,
          490,
          1040
        ]
      },
      {
        "transaction_id": 204,
        "package_name": "",
        "event_codes": [
          465,
          469,
          474,
          490
        ]
      },
      {
        "transaction_id": 207,
        "package_name": "",
        "event_codes": [
          465,
          469,
          471,
          474,
          490
        ]
      }
    ]
  }
]

我希望每个值的每个事务的事件代码。

2 个答案:

答案 0 :(得分:0)

如果您只想要一个事件代码整数的平面列表,您可以使用:

json_response.flat_map do |value_data|
  value_data[:events].flat_map do |event_data|
    event_data[:event_codes]
  end
end

更新基于评论“我只想在事务ID为205时提取事件代码”:

如果只有一个具有该交易ID的项目:

json_response.flat_map do |value_data|
  value_data[:events].find do |event_data|
    event_data[:transaction_id] == 205
  end[:event_codes]
end

如果可能有许多具有该交易ID的项目:

json_response.flat_map do |value_data|
  value_data[:events].select do |event_data|
    event_data[:transaction_id] == 205
  end.flat_map do |event_data|
    event_data[:event_codes]
  end
end

答案 1 :(得分:0)

您可以在响应中调用方法以查看正文,响应代码等。README

中的更多信息

添加到您的代码:

def self.call_legacy_transactions(tx_id = 205)
  get_response=RestClient::Request.execute(method: :get, url: 'URL', timeout: 15)
  puts(get_response.body)

  # check if the response was successful
  if get_response.code == 200
    # need to parse the body
    json_response = JSON.parse(get_response.body)

    # the json response is an array of json objects
    # we need to iterate over them and grab the value
    # in the `events` key and iterate over those and
    # select just the ones with the desired transaction id and
    # get the value in each of the `event_codes` keys and
    # then flatten all the sub arrays into one
    event_codes = json_response.flat_map do |data|
      data['events'].
        select { |event| event['transaction_id'] == tx_id }.
        flat_map { |event| event['event_codes'] }
    end

    event_codes # is now a list of just the event codes
  end
end

通过上述内容,您可以将事务ID传递给方法,以获取任何事务的事件代码,例如

call_legacy_transactions 205