Criando um web service RESTful com JAX-RS

REST é um padrão arquitetural baseado nas operações básicas do protocolo HTTP. Os posts REST, JAX-RS, RESTeasy e integração e Entendendo web services em Java (JAX-WS e JAX-RS) fornecem mais detalhes sobre REST.

Alguns conceitos sobre aplicações RESTful

Basicamente, uma aplicação REST utiliza o conceito de recursos, considerando tudo como recurso. O recurso é acessado e manipulado pelos métodos HTTP e cada recurso deve suportar ao menos um método HTTP. Além disso, um recurso possui uma representação que pode ser texto, XML, JSON, etc.

Os métodos HTTP básicos que geralmente são usados em arquiteturas REST são PUT, GET, POST e DELETE.

Uma aplicação que suporta o padrão arquitetural REST é uma aplicação RESTful.

Web services RESTful são baseados nos métodos HTTP e conceitos REST. Geralmente um web service RESTful define uma URI para cada serviço, o tipo de resposta (XML, texto, JSON, etc.) e as operações suportadas por meio dos métodos HTTP.

JAX-RS e suas implementações

JAX-RS é uma especificação da plataforma Java para desenvolvimento de web services RESTful e define uma série de anotações para web services. Jersey é a implementação de referência dessa especificação e fornece uma biblioteca para a implementação de web services em um servlet container, além de uma biblioteca para criação de clientes para acessar esses web services.

Do lado do servidor o Jersey identifica os recursos RESTful, recebe as requisições HTTP e seleciona o método e a classe correta para responder a requisição com base nas anotações das classes e métodos.

Além do Jersey, outras implementações populares são RESTeasy (JBoss), Apache CXF e Apache Wink.

Criando o webservice

A implementação utilizada neste exemplo será a Apache Wink. Crie um “Dynamic Web Project” no Eclipse e adicione as libs do Wink no diretório WEB-INF/lib.

Um webservice em REST é caracterizado por ser um recurso. Um recurso pode ser criado como um POJO com anotações JAX-RS. O recurso deste exemplo é implementado na listagem 1.

package com.gabrielamorim.rest;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("/hello")
public class Hello {

	@GET
	@Produces(MediaType.TEXT_HTML)
	public String sayHtmlHello() {
		return "<html> " + 
					"<title>Hello!</title>" + 
					"<body>Hello! It's a web service response!</body>" + 
				"</html> ";
	}
}

A anotação @Path configura o caminho do recurso, @GET indica que o método responderá a requisições HTTP GET e @Produces indica qual o tipo de conteúdo será produzido pelo método, nesse caso é HTML (MediaType.TEXT_HTML).

Quando a aplicação é inicializada os recursos precisam ser conhecidos. É preciso implementar uma classe que registre os recursos, essa classe deve extender javax.ws.rs.core.Application e registrar os recursos no método getClasses(). O código da listagem 2 mostra a implementação de uma sub-classe de javax.ws.rs.core.Application que registra o recurso Hello que foi implementado no código da listagem 1.

package com.gabrielamorim.rest;

import java.util.HashSet;
import java.util.Set;

import javax.ws.rs.core.Application;

public class HelloApplication extends Application {

    @Override
    public Set<Class<?>> getClasses() {
        Set<Class<?>> classes = new HashSet<Class<?>>();
        classes.add(Hello.class);
        return classes;
    }
}

O próximo passo é configurar o web.xml. A servlet do Apache Wink é configurada no deployment descriptor para ser inicializada utilizando uma instância de HelloApplication. A listagem 3 mostra a configuração do web.xml para este exemplo. A maioria das implementações JAX-RS exigem algum tipo de configuração semelhante.

<web-app>
	<servlet>
		<servlet-name>HelloWorldApp</servlet-name>
		<servlet-class>org.apache.wink.server.internal.servlet.RestServlet</servlet-class>
		<init-param>
			<param-name>javax.ws.rs.Application</param-name>
			<param-value>com.gabrielamorim.rest.HelloApplication</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>HelloWorldApp</servlet-name>
		<url-pattern>/rest/*</url-pattern>
	</servlet-mapping>
</web-app>

A aplicação e o webservice estão prontos, basta fazer o deploy em um container. O webservice pode ser acessado pelo navegador pela URL: http://localhost:8080/RestWebService/rest/hello

Outra forma de se implementar webservices é por meio da API JAX-WS. O post Criando um web service e um cliente com JAX-WS mostra o uso da API JAX-WS.

Leave a Reply

Your email address will not be published. Required fields are marked *