Obrigado @sam! Consigo ver (mesmo pela requisição GET) que deve ser bastante intuitivo: quando quero obter a página 2, adiciono uma opção adicional para page. Também consigo ver que “options” é algo que posso definir com a função discourse_api:
# frozen_string_literal: true
module DiscourseApi
module API
module Search
# Retorna resultados de busca que correspondem ao termo especificado.
#
# @param term [String] um termo de busca
# @param options [Hash] Um conjunto personalizável de opções
# @option options [String] :type_filter Retorna resultados do tipo especificado.
# @return [Array] Retorna os resultados como um array de Hashes.
def search(term, options = {})
raise ArgumentError.new("#{term} é obrigatório, mas não foi especificado") unless term
raise ArgumentError.new("#{term} é obrigatório, mas não foi especificado") unless !term.empty?
response = get('/search/query', options.merge(term: term))
response[:body]
end
end
end
end
Então, ao testar isso, esperaria obter resultados diferentes aqui para a página 1 e a página 2. Ou, para dar um pouco mais de separação, vamos usar as páginas 1 e 3. A consulta é para todos os tópicos de Perguntas e Respostas:
query = category["name"] + " #" + category["slug"]
=> "Q&A #q-a"
Agora, vamos recuperar as páginas 1 e 3 usando o cliente discourse_api:
topics1 = client.search(query, options={"page": "1"})
topics3 = client.search(query, options={"page": "3"})
Posso verificar o primeiro tópico de cada um:
=> {"id"=>220, "title"=>"Por que estou excedendo a cota?", "fancy_title"=>"Por que estou excedendo a cota?", "slug"=>"por-que-estou-excedendo-a-cota", "posts_count"=>3, "reply_count"=>0, "highest_post_number"=>3, "image_url"=>nil, "created_at"=>"2018-06-01T12:56:12.120Z", "last_posted_at"=>"2018-06-15T16:41:44.736Z", "bumped"=>true, "bumped_at"=>"2018-06-15T16:41:44.736Z", "unseen"=>false, "pinned"=>false, "unpinned"=>nil, "visible"=>true, "closed"=>false, "archived"=>false, "bookmarked"=>nil, "liked"=>nil, "tags"=>["storage", "quota"], "category_id"=>26, "has_accepted_answer"=>false}
irb(main):148:0> topics3['topics'][0]
=> {"id"=>220, "title"=>"Por que estou excedendo a cota?", "fancy_title"=>"Por que estou excedendo a cota?", "slug"=>"por-que-estou-excedendo-a-cota", "posts_count"=>3, "reply_count"=>0, "highest_post_number"=>3, "image_url"=>nil, "created_at"=>"2018-06-01T12:56:12.120Z", "last_posted_at"=>"2018-06-15T16:41:44.736Z", "bumped"=>true, "bumped_at"=>"2018-06-15T16:41:44.736Z", "unseen"=>false, "pinned"=>false, "unpinned"=>nil, "visible"=>true, "closed"=>false, "archived"=>false, "bookmarked"=>nil, "liked"=>nil, "tags"=>["storage", "quota"], "category_id"=>26, "has_accepted_answer"=>false}
Eles são exatamente iguais, o que, acredito, significa que a variável page não está funcionando? Quando inspeciono no Chrome DevTools, o ponto é acionado ao rolar para baixo (já que os posts são carregados automaticamente na janela), e posso confirmar que page=2 é o parâmetro correto:
Request URL: https://ask.cyberinfrastructure.org/search?q=Q%26A%20%23q-a&page=2
Request Method: GET
Status Code: 200 (from ServiceWorker)
Referrer Policy: strict-origin-when-cross-origin
ou, melhor ainda, basta olhar a lista de parâmetros:
Query String Parameters
q: Q&A #q-a
page: 2
Isso não é um envio de formulário, então não vejo nenhum “Form Data” conforme o exemplo.