Как мне вернуть выходной токен в цикле - Ruby Pagination? - PullRequest
0 голосов
/ 03 июня 2019

Я использую сервисы конфигурации AWS для запроса некоторых данных. Результаты разбиты на страницы, и токен предоставляется для следующей страницы ответов. Как я могу использовать его для, чтобы я мог запустить его один раз?

пример - https://docs.aws.amazon.com/sdk-for-ruby/v3/developer-guide/paging-responses.html

require 'aws-sdk'
require 'json'

QUERY = "
  SELECT
    resourceId
  WHERE
    resourceType = 'AWS::EC2::Instance'"

configservice = Aws::ConfigService::Client.new(region: 'eu-west-1')

next_token = nil

loop do
  response = configservice.select_resource_config({
    limit: 100,
    expression: QUERY,
    next_token: next_token
  }.compact)

    response.results.each { puts response[:results].map { |i| JSON.parse(i, symbolize_names: true) } }

  break if response.next_token.nil?
  next_token = response.next_token
end

редактировать - спасибо Константин Струков. Это то, что я сделал сейчас. это вроде работает, но, кажется, просто повторяет одну и ту же страницу несколько раз, вместо того, чтобы переходить к следующей. Есть идеи?

Ответы [ 2 ]

0 голосов
/ 04 июня 2019

Константин Струков - спасибо за помощь.Я понял, что мне нужно было сделать из вашего примера.

require 'aws-sdk'
require 'json'

QUERY = "
  SELECT
    resourceId,
    tags
  WHERE
    resourceType = 'AWS::EC2::Instance'"

configservice = Aws::ConfigService::Client.new(region: 'eu-west-1')

next_token = nil

loop do
  response = configservice.select_resource_config({
    limit: 100,
    expression: QUERY,
    next_token: next_token
  }.compact)

    response.results.each {|i| puts JSON.parse(i, symbolize_names: true)}

  break if response.next_token.nil?
  next_token = response.next_token
end

0 голосов
/ 03 июня 2019

Не уверен, правильно ли я понимаю вашу проблему, потому что задача выглядит для меня довольно просто, согласно вашему собственному описанию:

  1. Получите ответ, переберите данные и обработайте их как-нибудь

  2. Если ответ содержит next_token, повторите (1), используя предоставленный следующий_текст

  3. В противном случае выйдите.

Предполагая, что ответ последней страницы имеет значение nil как next_token (я не нашел точного ответа в документации по SDK, поэтому лучше сначала проверить это предположение) может сработать что-то вроде следующего:

require 'aws-sdk'

QUERY = <<~
  SELECT
    resourceId
  WHERE
    resourceType = 'AWS::EC2::Instance'
QUERY

configservice = Aws::ConfigService::Client.new(region: 'eu-west-1')

next_token = nil

loop do
  response = configservice.select_resource_config({
    limit: 100,
    expression: QUERY,
    next_token: next_token
  }.compact)

  response.results.each { ... } # do something with the results

  break if response.next_token.nil?
  next_token = response.next_token
end

P.S. Я не понимаю, как

get_ec2.each do |response|
  puts response.map(&:next_token)
end

может работать в вашем примере, принимая во внимание, что ответ является просто структурой , поэтому его '#each просто перебирает поля структур (и никто из них не отвечает на next_token). Это действительно работает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...