Olá pessoal
Sempre recebo perguntas de como fazer paginação ao fazer um web service, pois no meu livro de Web Services os exemplos sempre retornam todos os registros do banco de dados.
Por exemplo, neste web service é retornado todos os carros do servidor:
http://livrowebservices.com.br/rest/carros
E para quem leu o livro de REST, sabe que podemos buscar os carros por tipo, dentre outras buscas, exemplo:
http://livrowebservices.com.br/rest/carros/tipo/classicos
http://livrowebservices.com.br/rest/carros/tipo/esportivos
http://livrowebservices.com.br/rest/carros/tipo/luxo
Mas e se existir 1 milhão de registros no banco de dados? Neste caso o recomendado é retornar os registros paginados, por exemplo de 10 em 10, ou 20 em 20, conforme a necessidade.
Fazer isso é simples, então se você tem o código-fonte do projeto RESTful dos carros, é só fazer 2 pequenas alterações:
Na classe CarrosResource, tem um exemplo do tipo GET configurado, o qual retorna todos os carros no formato JSON, lembra-se?
@GET public List<Carro> get() { List<Carro> carros = carroService.getCarros(); return carros; }
O que podemos fazer é adicionar 2 parâmetros. Um deles para indicar a página que você está solicitando e outro para indicar a quantidade de registros que devem ser retornados.
Exemplo:
@GET @Path("/page/{page}/max/{max}") public List<Carro> get(@PathParam("page") int page,@PathParam("max") int max) { List<Carro> carros = carroService.getCarros(page,max); return carros; }
Isso vai criar os seguintes links do web service:
1ª página: http://livrowebservices.com.br/rest/carros/page/0/max/5
2ª página: http://livrowebservices.com.br/rest/carros/page/1/max/5
3ª página: http://livrowebservices.com.br/rest/carros/page/2/max/5
Veja que a 1ª página começa em zero (0) e neste exemplo solicitei que o servidor retorne sempre 5 carros.
E por aí vai…
Para o exemplo compilar, crie o seguinte método na classe CarroDAO.
public List<Carro> getCarros(int page, int max) { Query q = getSession().createQuery("from Carro"); setPage(q, page, max); List<Carro> carros = q.list(); return carros; }
O framework Hibernate que estudamos no livro nos ajuda a fazer a paginação. Eu gosto de criar um método setPage(…) como esse:
protected void setPage(Query q, int page, int max) { // Paginação int firstResult = 0; if (page != 0) { firstResult = page * max; } q.setFirstResult(firstResult); q.setMaxResults(max); }
Bom é isso 🙂 Se alguém tiver alguma dúvida avisa, pois o conceito é bem simples.
Com web services paginados, o correto seria alterar os aplicativos mobile para buscar sempre de 10 em 10 registros, por exemplo. Oas isso fica para uma próxima vez 🙂
abraço
Fala Ricardo blz?, acho que faltou um exemplo de não somente carregar uma quantidade em uma requisição mas carregar em ranger, por exemplo em uma lista: na primeira requisição carrego os 10 primeiros, na segunda do 11º até 20º por exemplo…
Oi Josinaldo, tudo bem? Mas eu fiz isso, veja os exemplos de links q postei 🙂 Eles carregam um range, abs.
muito bom seu artigo parabanes
Obrigado Rachel, que bom que gostou.