как бороться с разбиением на страницы при создании запроса API с использованием httparty rubygem - PullRequest
0 голосов
/ 04 июня 2019

Я пытаюсь написать плагин для моего сайта Jekyll, который записывает отсортированный ответ JSON в файл данных, но у меня возникают проблемы с ограничением элементов в ответе. Основной ответ выглядит так:

{
  "current_page": 1,
  "per_page": 50,
  "total_pages": 19,
  "url": "https://web.consonance.app/api/v2/products.json",
  "products": [
    {
      ...
      "pub_date": "2017-05-01"
      ...
    },
    ...
  ]
}

где products - это массив книг, которые я хочу отсортировать по дате их публикации (pub_date). Нет next_page URL, только current_page и total_pages. Мой плагин очень простой. Он использует httparty для выполнения запроса API, затем сортирует ответ как хеш по pub_date. Пока это выглядит так:

require 'rubygems'
require 'httparty'
require 'json'

# http request to api

url = 'https://web.consonance.app/api/v2/products.json'
query = {
}
headers = {
  Authorization: "Token token=**************"
}
response = HTTParty.get(url, query: query, headers: headers)

# convert response to hash array

hash = JSON.parse(response.body)

# reverse sort product in products by date published

hash_sorted = hash['products'].sort_by! { |o| o['pub_date'] }.reverse!

# open _data file and write json response

File.open("./_data/products.json", "w") { |file| 
  file.puts JSON.pretty_generate(hash_sorted)
}

, который дает мне JSON-ответ первых 50 элементов, отсортированных по pub_date. Мой вопрос:

Как получить самую последнюю опубликованную книгу (product) из всего массива, а не только из первых 50 результатов?

Я пытался увеличить лимит на страницу до максимума, который составляет 500 единиц, но общее количество книг охватывает более одной страницы, поэтому у меня все еще есть проблема с нумерацией страниц.

Доступные параметры для запроса задокументированы здесь .

NB - я использую httparty, потому что мне было легко сделать запрос, но я открыт для использования других гемов / методов. Я только начал изучать Ruby, поэтому, пожалуйста, потерпите меня.

1 Ответ

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

Используя current_page и total_pages в качестве условий, я перебрал страницы ответа и назначил все продукты в массив:

while current_page <= total_pages do

  url = 'https://web.consonance.app/api/v2/products.json'
  query = {
    'page' => "#{current_page}",
  }
  request = HTTParty.get(url, query: query)

  hash = JSON.parse(request.body)

  hash['products'].each do |item|
    product_array.push(item)
  end

  current_page += 1

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