Neste artigo iremos mostrar de maneira prática, diversas formas de se injetarem dados de uma requisição HTTP em métodos Java, usando a especificação Java para WS Rest, ou JAX-RS. De acordo com esta especificação, é possível se implementar um recurso web como um documento, uma imagem, ou o cadastro de um usuário, utilizando-se classes Java para representar esses recursos. Para isso, iremos construir uma aplicação, a musicApp, uma loja on-line para vendas de ingressos de shows, e outros artigos relacionados a Rock, utilizando o framework RESTEasy. A figura 1 mostra alguns recursos da nossa aplicação, e como são representados por métodos e classes Java, mostrados na Listagem 1.
@Path("/show") public class ShowResource { @GET @Path("/comprar") @Produces(MediaType.TEXT_PLAIN) public Double comprarIngresso() { Double valorIngresso = 150.00; return valorIngresso; } }
Tudo bem até agora, mas vamos pensar em um cenário mais real. E se quisermos realmente comprar um ingresso? Precisaríamos informar, por exemplo, qual show pretendemos ir, e quantos ingressos vamos querer comprar. Mas para fazer isso, precisamos passar alguns parâmetros para o método comprarIngresso(). Este método, em nosso caso, será responsável por realizar o cálculo do valor a ser pago pelo ingresso, mas em outros cenários, poderia delegar esta obrigação para um objeto de negócio. Certo, mas como podemos fazer o nosso método receber diretamente informações do HTTP? Não se preocupe, a especificação JAX-RS cuidou disso para nós. Existem diversas formas de se fazer isso, através das anotações presentes nessa especificação. Vamos a elas:
Nome do Parâmetro | Anotação Equivalente | Exemplos de URL |
---|---|---|
PathParam | @ PathParam | /show/comprar/Angra/4 |
MatrixParam | @ MatrixParam | /show/comprar;A1=Angra;A2=4 |
QueryParam | @ QueryParam | /show/comprar?A1=Angra&A2=4 |
Os parâmetros definidos através da anotação @PATH podem ser recuperados através das anotações @PathParam, @MatrixParam, @QueryParam, sendo que cada anotação corresponde a um tipo de manipulação de URI diferente, conforme mostrado na tabela acima. Essas anotações são aplicadas nos argumentos dos métodos de uma resource class. A Listagem 1 mostra o exemplo de um @PathParam, a Listagem 2 mostra o exemplo de um @MatrixParam, e a Listagem 3 o exemplo de uma @QueryParam.
@GET @Path("/comprar/{A1}/{A2}") @Produces(MediaType.TEXT_PLAIN) public Double comprarIngresso (@PathParam("A1") String show, @PathParam("A2") Double quantidade){ double valorIngresso = 0.0; if (show.equalsIgnoreCase("METALLICA")){ valorIngresso = 250.00; }else if (show.equalsIgnoreCase("MATANZA")){ valorIngresso = 50.00; } return valorIngresso * quantidade; }
Para acessarmos o recurso mostrado na Listagem 2, iremos digitar a seguinte URL: http://localhost:8080/musicApp/show/comprar/MATANZA/3. Feito isso, iremos obter o resultado 150.0, no browser.
@GET @Path("/comprar") @Produces(MediaType.TEXT_PLAIN) public Double comprarIngresso (@MatrixParam("A1") String show, @MatrixParam("A2") Double quantidade){ double valorIngresso = 0.0; if (show.equalsIgnoreCase("METTALICA")){ valorIngresso = 250.00; }else if (show.equalsIgnoreCase("MATANZA")){ valorIngresso = 50.00; } return valorIngresso * quantidade; }
Para acessarmos o recurso mostrado na Listagem 3, iremos digitar a seguinte URL: http://localhost:8080/musicApp/show/comprar;A1=MATANZA;A2=4. Feito isso, o resultado 200.0 irá aparecer no browser.
@GET @Path("/comprar") @Produces(MediaType.TEXT_PLAIN) public Double comprarIngresso (@QueryParam("A1") String show, @QueryParam("A2") Double quantidade){ double valorIngresso = 0.0; if (show.equalsIgnoreCase("METTALICA")){ valorIngresso = 250.00; }else if (show.equalsIgnoreCase("MATANZA")){ valorIngresso = 50.00; } return valorIngresso * quantidade; }
Para acessarmos o recurso mostrado na Listagem 4, iremos digitar a seguinte URL: http://localhost:8080/musicApp/show/comprar?A1=MATANZA&A2=9. Feito isso, o resultado 450.0 irá aparecer no browser.
Para a aplicação que iremos desenvolver neste artigo, utilizaremos o framework RESTEasy, incorporado nativamente ao servidor de aplicação JBoss AS7. Este servidor já deve estar instalado e configurado, juntamente com a IDE eclipse para JEE. Vamos iniciar nossa aplicação criando um novo Dynamic Web Project no eclipse selecionado o JBoss 7.1 como servidor de aplicação. Após isso, vamos em next, até a tela onde informaremos à IDE que desejamos que gere o nosso Deployment Descriptor, conforme pode ser visto na figura 3. Após isso, clique em finish.
Antes de iniciar, configure o RESTEasy no Deployment Descriptor da aplicação, conforme a Listagem 4. Após isso, vamos criar nossa classe de recurso, onde serão inseridos todos os métodos mostrados anteriormente.
<context-param> <param-name>resteasy.scan</param-name> <param-value>true</param-value> </context-param> <listener> <listener-class>org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class> </listener> <servlet> <servlet-name>resteasy-servlet</servlet-name> <servlet-class> org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class> </servlet> <servlet-mapping> <servlet-name>resteasy-servlet</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>
A Listagem 6 mostra a nossa aplicação completa, com todos os métodos e seus respectivos parâmetros.
import javax.ws.rs.GET; import javax.ws.rs.MatrixParam; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; @Path("/show") public class ShowResource { @GET @Path("/comprar/{A1}/{A2}") @Produces(MediaType.TEXT_PLAIN) public Double comprarIngressoPath (@PathParam("A1") String show, @PathParam("A2") Double quantidade){ double valorIngresso = 0.0; if (show.equalsIgnoreCase("METALLICA")){ valorIngresso = 250.00; }else if (show.equalsIgnoreCase("MATANZA")){ valorIngresso = 50.00; } return valorIngresso * quantidade; } @GET @Path("/comprar") @Produces(MediaType.TEXT_PLAIN) public Double comprarIngressoMatrix (@MatrixParam("A1") String show, @MatrixParam("A2") Double quantidade){ double valorIngresso = 0.0; if (show.equalsIgnoreCase("METTALICA")){ valorIngresso = 250.00; }else if (show.equalsIgnoreCase("MATANZA")){ valorIngresso = 50.00; } return valorIngresso * quantidade; } @GET @Path("/comprar") @Produces(MediaType.TEXT_PLAIN) public Double comprarIngressoQuery (@QueryParam("A1") String show, @QueryParam("A2") Double quantidade){ double valorIngresso = 0.0; if (show.equalsIgnoreCase("METTALICA")){ valorIngresso = 250.00; }else if (show.equalsIgnoreCase("MATANZA")){ valorIngresso = 50.00; } return valorIngresso * quantidade; } }
Bom pessoal, por hoje é isso, até o próximo artigo, abraço.