Java EE versão 6 incluí suporte a Java API para RESTful Web Services (JAX-RS), que disponibiliza um framework baseado em POJOs para criar Web Services com uma arquitetura de acordo com os padrões REST (Representational State Transfer). A API JAX-RS, que faz parte da JSR 311, disponibiliza várias annotations que podem ser utilizadas para expor métodos de classes Java como recursos da web.
O JAX-RS faz automaticamente a conversão entre tipos do Java e os MIME do HTTP. Por exemplo, se você marcar um método de uma classe com a annotation "@Produces (MediaType.TEXT_PLAIN)", o JAX-RS converteria o tipo Java para o MIME "text/plain", que representa texto sem formatação, e retornaria o conteúdo dentro do HTTP como resposta para o cliente.
Como toda especificação, para utilizar os recursos disponíveis na API JAX-RS, é necessário o uso de alguma implementação da mesma. O projeto open source Jersey é a implementação de referência da versão 1.1 da JAX-RS.
As annotations são usadas para identificar recursos que deseja-se disponibilizar e que possam atender requisições HTTP. Existem várias annotations disponíveis na JAX-RS, dentre eles as principais são:
- @Path: Especifica um caminho relativo para um determinado recurso. Também identifica em qual URI um recurso será disponibilizado para receber requisições
- @GET: Especifica que um método (recurso) processará apenas requisições do tipo GET. Quando algum cliente faz uma requisição do tipo GET para uma URI que identifica um recurso, em tempo de execução a JAX-RS invoca o método anotado para manipular aquela requisição.
- @POST: Tem a mesma funcão do @Get, porém, atende apenas requisições do tipo POST.
- @Produces: Especifica os tipos MIME que o método produzirá como resposta para o cliente.
- @Consumes: Especificas os tipos MIME que o método pode receber do cliente.
Uma dica importante é que pode-se anotar uma classe com as anotações @Produces e @Consumes, isto implicaria que todos os métodos disponibilizados como recurso naquela classe produziriam ou consumiriam, respectivamente, o tipo que foi definido. Lembrando que anotando uma classe com @Produces ou @Consumes, e depois o método, a JAX-RS priorizará a annotation mais específica, no caso a annotation do método.
JAX-RS também disponibiliza outras features bem interessantes como annotations parameter-based que podem ser utilizadas para extrair informações referentes a uma requisição. Uma delas é a @QueryParam, que pode ser usada para extrair informações de query de uma determinada URL. Existem também a @MatrixParam, que extrai informações do caminho de uma URL, a @HeaderParam serve para extrair informações do cabeçalho do HTTP, e a @CookieParam que extrai informações de cookies de uma requisição.
Há também um número de classes utilitárias e interfaces que simplificam ainda mais a criação e utilização de web services RESTful em Java. Algumas destas classes são:
- Classe MediaType pode ser usada para abstrair os tipos MIME. As instâncias desta classe são imutáveis.
- UriInfo é uma interface para acessar a aplicação e solicitar informações da URI.
- UriBuilder, uma classe utilitária com templates de URI, utilizada para a criação de URIs a partir de seus componentes.
- Reponse é uma classe abstrata que representa uma HTTP response. Define o contrato entre uma instância retornada e o runtime, quando um aplicativo precisa fornecer metadados em runtime. Uma classe da aplicação pode simplesmente estender esta classe ou ainda usar um dos seus métodos estáticos para criar uma instância usando o ResponseBuilder.
- Response.ResponseBuilder, uma classe que cria objetos do tipo Response, em conformidade com o padrão de projeto Builder.
Com a liberação do Java EE 6, uma das especificações mais comentados e questionadas em blogs é a JAX-RS. Questiona-se muito sobre o propósito da API JAX-RS, que é focada no uso de URIs e de métodos HTTP, porém, não facilita a criação de aplicações com baixo acoplamento, ou seja, aplicações que fazem uso do conteúdo hipermídia para tornarem-se desacoplados. O Restfulie é uma alternativa para o uso de Restful com suporte a baixo acoplamento utilizando o poder do conteúdo hipermídia. Guilherme Silveira idealizador da ferramenta diz em seu blog que aplicações como RestEasy ignoram esse poder do conteúdo hipermidia:
RESTEasy acertou quando permite que o usuário acesse multiplas URI e o protocolo http como o protocolo de aplicação. Mas isso apenas ajuda a criar sistemas fortemente acoplados. Aqueles que usam JAXB (requerido pelo JAX-RS) e xml schema fixos e que não permitem ao servidor evoluir sem notificar seus clientes.
O RESTEasy da JBoss é outra implementação da especificação JAX-RS. O framework Apache CXF também oferecerá suporte para a JAX-RS 1.1 como parte de sua release 2.3.
Utilizar JAX-RS sem utilizar os benefícios do conteúdo hipermídia é mesmo utilizar REST?