[Dúvida] Paginação de Api com retorno de Json, como vocês tem feito ?

889 views
Skip to first unread message

Leandro Machado Pereira

unread,
Oct 11, 2016, 11:52:04 AM10/11/16
to rails-br

Pessoal, tivemos uma pequena discussão na nossa daily de hoje referente ao envio de informações sobre paginação no header.


Alguns acham que fica escondido, e quem não dá muita manutenção no projeto, pode ter problemas na hora de debug, então alguns sugeriram deixar no corpo da resposta.


Gostaria de saber se vocês como vocês estão fazendo isso.


Bem, seguindo este post, eu implementei uma solução com header onde houve a discussão de hj.

http://www.metabates.com/2012/02/22/adding-pagination-to-an-api/


No comentários do post acima, uma pessoa disse ter criado uma gem para encapsular o retorno, mas as informações não foram suficientes para mim, então segui o post do autor e customizei o retorno.
https://github.com/richardkall/api_pagination_headers


Essas duas gems também enviam as informações de paginação no header.
https://github.com/davidcelis/api-pagination
https://github.com/IcaliaLabs/pager-api


Um comentário interessante é este aqui:http://stackoverflow.com/questions/12168624/pagination-response-payload-from-a-restful-api?answertab=votes#tab-top


Em resumo, Para as máquina adiciona-se o header, e para os humanos a informação no corpo quando for enviado parâmetro na requisição.


Neste mesmo link, mais abaixo tem outro comentário do envio pelo header, que tem o link para este
https://www.w3.org/wiki/LinkHeader


Porém este da w3, parece ser mais voltado a xml e não json.


Neste link, o dono do repositório diz que é um sample de documentação do swagger que utiliza o header também.
https://github.com/adnan-kamili/rest-api-response-format


O que acham? 

Como vocês tem feito isso ?

Existe algum padrão de como seria o correto ?


Deixo aqui de antemão, o meu agradecimento aos comentários.

Douglas Rossignolli

unread,
Oct 11, 2016, 12:03:14 PM10/11/16
to rail...@googlegroups.com
Eu uso no corpo do retorno mesmo e como parametro na url:

{
  objects: [],
  current_page: 1,
  per_page: 10,
  total_pages: 90
}

mais ou menos isso como eu monto e na url:

/users?page=1&per_page=10 por exemplo

--
--
Você recebeu essa mensagem porquê está inscrito no Google
Groups "rails-br".
Para enviar uma mensagem para o grupo, mande um email para rail...@googlegroups.com
Para se descadastrar, mande um e-mail para
rails-br+unsubscribe@googlegroups.com
Visite o grupo em http://groups.google.com/group/rails-br?hl=pt-BR
Leia nossa política de uso: http://goo.gl/YGgt7

---
Você recebeu essa mensagem porque está inscrito no grupo "rails-br" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para rails-br+unsubscribe@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.



--
Atenciosamente,
Douglas Rossignolli

Leandro Machado Pereira

unread,
Oct 11, 2016, 12:12:53 PM10/11/16
to rail...@googlegroups.com
@Douglas, obrigado por compartilhar.

Minha implementação(ainda em dev) também está com o parâmetro na url de requisição, mas o retorno de informação de paginação está no header.

O recurso sem paginação já existe, e é consumido por outras api's internas. 

O front que está em uma SPA em angular, que está precisando da paginação.

Para que o retorno não sofra alterações, optei por incrementar o header.

Um exemplo do meu retorno.

[{
  • id: 578,
  • nome: "Albânia",
  • abreviacao: "ALB",
  • pais: "Albânia",
  • slug: "albania"
}]


Visite o grupo em http://groups.google.com/group/rails-br?hl=pt-BR
Leia nossa política de uso: http://goo.gl/YGgt7

---
Você recebeu essa mensagem porque está inscrito no grupo "rails-br" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para rails-br+u...@googlegroups.com.

Para mais opções, acesse https://groups.google.com/d/optout.



--
Atenciosamente,
Douglas Rossignolli

--
--
Você recebeu essa mensagem porquê está inscrito no Google
Groups "rails-br".
Para enviar uma mensagem para o grupo, mande um email para rail...@googlegroups.com
Para se descadastrar, mande um e-mail para

Visite o grupo em http://groups.google.com/group/rails-br?hl=pt-BR
Leia nossa política de uso: http://goo.gl/YGgt7

---
Você recebeu essa mensagem porque está inscrito no grupo "rails-br" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para rails-br+u...@googlegroups.com.

George Moura

unread,
Oct 11, 2016, 12:15:37 PM10/11/16
to rails-br

George Moura
(71) 98788-6089
Desenvolvedor Web e Mobile

Rodrigo Monteiro Ferreira

unread,
Oct 11, 2016, 12:17:54 PM10/11/16
to rail...@googlegroups.com
Não recomendo no header tambem não, Eu seguiria o padrao json-api(http://jsonapi.org/), ele é o padrão padrao recomendado no rails 5: https://github.com/rails-api/active_model_serializers




Visite o grupo em http://groups.google.com/group/rails-br?hl=pt-BR
Leia nossa política de uso: http://goo.gl/YGgt7

---
Você recebeu essa mensagem porque está inscrito no grupo "rails-br" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para rails-br+unsubscribe@googlegroups.com.

Para mais opções, acesse https://groups.google.com/d/optout.
--
Atenciosamente,
Douglas Rossignolli

--
--
Você recebeu essa mensagem porquê está inscrito no Google
Groups "rails-br".
Para enviar uma mensagem para o grupo, mande um email para rail...@googlegroups.com
Para se descadastrar, mande um e-mail para

Visite o grupo em http://groups.google.com/group/rails-br?hl=pt-BR
Leia nossa política de uso: http://goo.gl/YGgt7

---
Você recebeu essa mensagem porque está inscrito no grupo "rails-br" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para rails-br+unsubscribe@googlegroups.com.

Para mais opções, acesse https://groups.google.com/d/optout.

--
--
Você recebeu essa mensagem porquê está inscrito no Google
Groups "rails-br".
Para enviar uma mensagem para o grupo, mande um email para rail...@googlegroups.com
Para se descadastrar, mande um e-mail para

Visite o grupo em http://groups.google.com/group/rails-br?hl=pt-BR
Leia nossa política de uso: http://goo.gl/YGgt7

---
Você recebeu essa mensagem porque está inscrito no grupo "rails-br" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para rails-br+unsubscribe@googlegroups.com.

Para mais opções, acesse https://groups.google.com/d/optout.



--
Rodrigo Monteiro
rodrigom...@gmail.com
(11) 96267-9366

Douglas Rossignolli

unread,
Oct 11, 2016, 12:20:13 PM10/11/16
to rail...@googlegroups.com
Não gostei muito dessa especificação não, muito trabalhoso, prefiro um design mais simples que atende.

Rodrigo Monteiro Ferreira

unread,
Oct 11, 2016, 12:26:55 PM10/11/16
to rail...@googlegroups.com
O adapter do AMS já faz automaticamente nesse padrão, no exemplo contem todos elementos mas voce pode usar somente os que precisa no formato correto algo com somente "links e data".

Kleber Shimabuku

unread,
Oct 11, 2016, 6:28:51 PM10/11/16
to rails-br
Opa,

Uso essa gem do api-pagination num projeto pessoal e criei uma libzinha (railtie) que trabalha em conjunto com essa outra gem (https://github.com/asplake/link_header) pra poder fazer a paginação com o kaminari.

Paulo Patto

unread,
Oct 11, 2016, 8:39:32 PM10/11/16
to rail...@googlegroups.com
Olá Leandro, tudo bem?

Excelente tópico esse seu. Bem eu peço lincensa e vou expor o meu ponto de vista com base em minha experiência com apis.

Já adianto que não li todos os links aí referênciados, então posso ser repetitivo em alguma coisa.

Já adianto que não acho que existe uma resposta do tipo certo e errado para essa questão. As duas abordagens são válidas, mas fico mais inclinado a usar headers e não o corpo da resposta é vou explicar o porquê.

 - usar o corpo da mensagem acho que simplifica a API é tanto o HAL/HAOTEAS se não estou enganado preevem o uso de link. Mas acho que a recomendação principal é usar o Header link não? Acho que tem até um RFC sobre usar headers.

- acho que essa da manutenção, bem a obrigação de saber sobre o Header é a consulta a doc e garantir que a API tenha uma boa doc.

- se vamos falar de uso de padrão em Framework acho que temos de usar referência um fw especialista em api e o padrão do grape e do praxxys ao que me lembro é com o uso de headers.

Tenho um argumento sobre o uso de crawler  em um job que fiz mas aqui no trem não é o lugar para me extender mais ainda no texto. Vou ler as referências com calma e quem sabe volte e possa acrescentar algo mais. 

Abraços.

--
--
Você recebeu essa mensagem porquê está inscrito no Google
Groups "rails-br".
Para enviar uma mensagem para o grupo, mande um email para rail...@googlegroups.com
Para se descadastrar, mande um e-mail para

Visite o grupo em http://groups.google.com/group/rails-br?hl=pt-BR
Leia nossa política de uso: http://goo.gl/YGgt7

---
Você recebeu essa mensagem porque está inscrito no grupo "rails-br" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para rails-br+u...@googlegroups.com.

Leandro Machado Pereira

unread,
Oct 26, 2016, 8:39:49 AM10/26/16
to rail...@googlegroups.com
Pessoal, apenas para não parecer que deixei o tópico largado.

Optamos por deixar a implementação que já havia feito e estava funcionando que foi feita seguindo 
Com as sugestões de todos, para projetos futuros iremos utilizar o retorno conforme o jsonapi.

Muito obrigado a todos que contribuíram.
Reply all
Reply to author
Forward
0 new messages