Paginação com web services

Posted by rlecheta on junho 27, 2016
Tutorial, Web Services

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.

rest

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

 

4 Comments to Paginação com web services