Injetando dados de requisições HTTP em métodos Java usando JAX-RS
Veja neste artigo, 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.
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//")
@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//")
@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.
Artigos relacionados
-
Artigo
-
Artigo
-
Artigo
-
Artigo
-
Vídeo