Web Service REST
O serviço web (web service) é uma forma de integração bem utilizada atualmente para realizar a integração entre aplicações. O Web Service REST é uma das formas de criar um serviço web, que utilizada muito o protocolo HTTP para realizar essa integração entre as aplicações.
O Web Service REST pode disponibilizar através do protocolo HTTP métodos para manipulação de informações, por exemplo: na figura a seguir mostra uma requisição HTTP através do método GET para a URL http://localhost:8080/MeuCinema/webresources/filmes para obter um recurso, que nesse caso é uma lista de filmes. Se chamar essa URL através de um navegador podemos verificar o retorno desse Web Service REST.
Para exemplificar crie uma Aplicação Web chamada MeuCinema. Dentro desse projeto vamos criar um Web Service REST, para isso clique com o botão direito do mouse sobre o Pacotes de Códigos-Fonte e escolha no menu a opção Novo e depois Outros.
Na tela de Novo Arquivo apresentada na figura a seguir, escolha a categoria Web Services, depois escolha o tipo de arquivo Web Services RESTful a partir dos Padrões e clique em Próximo para continuar.
Na tela de Novo Web Services RESTful a partir dos Padrões apresentado na figura a seguir, escolha a opção Recurso Raiz Simples e clique em Próximo.
Continuando a criação do Web Service RESTful, defina as opções:
- Pacotes do Recurso: br.metodista.servicos
- Caminho: filmes
- Nome da Classe: FilmesResource
- Tipo MIME: application/json
E clique em Finalizar para terminar a criação do Web Service RESTful.
A estrutura do projeto ficará com a seguinte aparência:
A classe FilmesResource é o Web Service REST, para interagir com ele será utilizado os métodos do HTTP, o NetBeans gera essa classe com os métodos GET e PUT:
@GET
@Produces("application/json")
public String getJson() {
//TODO return proper representation object
throw new UnsupportedOperationException();
}
@PUT
@Consumes("application/json")
public void putJson(String content) {
}
Nesses métodos vamos trocar informações no formato JSON.
Para converter objeto Java em JSON, podemos usar uma API simples do Google chamada GSon (https://code.google.com/p/google-gson) que realiza essa conversão de maneira fácil. Faça o download da biblioteca gson e adicione na biblioteca do projeto.
Vamos criar uma classe chamada Filme no pacote br.metodista.modelo para representar o recurso que desejamos compartilhar através do Web Service REST.
package br.metodista.modelo;
public class Filme {
private Long id;
private String filme;
private String sinopse;
private String genero;
private Integer duracao;
private String trailer;
public Filme(Long id, String filme, String sinopse,
String genero, Integer duracao, String trailer) {
this.id = id;
this.filme = filme;
this.sinopse = sinopse;
this.genero = genero;
this.duracao = duracao;
this.trailer = trailer;
}
// get e set dos atributos.
}
Vamos agora alterar a classe FilmesResource, dentro dela crie uma lista de filmes e altere o construtor para inicializar alguns filmes para teste:
private static List<Filme> filmes;
public FilmeResource() {
filmes = new ArrayList<Filme>();
filmes.add(new Filme(1L, "007: Operação Skyfall",
"Em 007 - Operação Skyfall, a lealdade de Bond a M
é testada quando o seu passado volta a atormetá-la.
Com a MI6 sendo atacada, o 007 precisa rastrear e
destruir a ameaça, não importando o quão pessoal
será o custo disto.", "Ação", 145, ""));
filmes.add(new Filme(2L, "Atividade Paranormal 4",
"Atividade Paranormal 4 se passa em 2011, cinco
anos depois de Katie matar seu namorado Micah, sua
irmã Kristi e seu marido Daniel e levar seu bebê,
Hunter. A história centra-se em Alice e sua mãe,
experimentando atividades estranhas quando os novos
vizinhos mudam-se para a casa ao lado.", "Suspense",
89, ""));
filmes.add(new Filme(3L, "Até Que A Sorte Nos Separe",
"Livremente inspirado no best-seller Casais Inteligentes
Enriquecem Juntos, Até que a sorte nos separe é uma
comédia romântica sobre as aventuras de um casal que
consegue, 2 vezes, o quase impossível: Ganhar na
loteria e gastar tudo em dez anos...o filme fará com
que o público se divirta e se identifique com os
segredos e trapalhadas de uma família descobrindo
que uma boa conta bancária até ajuda, mas desde que
você saiba o que fazer com ela.", "Comédia", 104, ""));
filmes.add(new Filme(4L, "Busca implacável 2", "Em
Istambul, agente aposentado da CIA, Bryan Mills, e sua
mulher são feitos reféns pelo pai de um sequestrador
que Mills matou durante o resgate de sua filha no
primeiro filme.", "Ação", 94, ""));
filmes.add(new Filme(5L, "Gonzaga de Pai para Filho",
"Um pai e um filho, dois artistas, dois sucessos. Um
do sertão nordestino, o outro carioca do Morro de São
Carlos; um de direita, o outro de esquerda. Encontros,
desencontros e uma trilha sonora que emocionou o Brasil.
Esta é a história de Luiz Gonzaga e Gonzaguinha, e de
um amor que venceu o medo e o preconceito e resistiu à
distância e ao esquecimento.", "Drama", 130, ""));
filmes.add(new Filme(6L, "Hotel Transilvânia 3D",
"Bem-vindos ao Hotel Transilvânia, o luxuoso resort
'cinco estacas' de Drácula, onde monstros e suas
famílias podem viver livres da intromissão do mundo
humano. Mas há um fato pouco conhecido sobre Drácula:
ele não é apenas o príncipe das trevas, mas também
é um pai super-protetor de uma filha adolescente,
Mavis, e inventa contos de perigo para dissuadir
seu espírito aventureiro.", "Infantil", 93, ""));
filmes.add(new Filme(7L, "Possessão", "Uma jovem
compra uma caixa antiga sem saber que dentro do
objeto existe um espírito malicioso. Os pais da
menina tentam encontrar uma maneira de acabar com
a maldição que domina sua filha.", "Terror", 92,
""));
}
Também vamos alterar o método getJson() para devolver uma String com contendo todos os filmes no formato um JSON:
@GET
@Produces("application/json")
public String getFilmes() {
Gson gson = new Gson();
return gson.toJson(filmes);
}
Para testas se o método GET do Web Service REST está funcionando, publique a aplicação MeuCinema no GlassFish e acesse a URL: http://localhost:8080/MeuCinema/webresources/filmes.
Deverá apresentar a lista de filmes no formato JSON.
Vamos adicionar também um método para obter apenas um filme através de seu ID, na classe FilmesResource adicione o método:
@GET
@Path("{filmeId}")
@Produces("application/json")
public String getFilme(@PathParam("filmeId")
String filmeId) {
for(Filme f : filmes) {
if(f.getId() == Long.valueOf(filmeId)) {
Gson gson = new Gson();
return gson.toJson(f);
}
}
return null;
}
Para chamar esse método acesse a URL http://localhost:8080/MeuCinema/webresources/filmes/3.
Consumindo um web service REST
Para consumir um Web Service REST, existem diversas implementações possíveis, uma delas é através da API Jersey, que é a implementação de referência do JavaEE.
Crie uma aplicação web chamada MeuCinemaJSF, que utiliza o framework do JavaServer Faces para criação das páginas WEB.
Vamos alterar uma página inicial index.xhtml, para que ela utilize um managed bean para consumir esse web serviço, a página ficará assim:
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html">
<h:head>
<title>Meu Cinema</title>
</h:head>
<h:body>
<h1>Filmes em cartaz</h1>
<h:outputText value="#{cinemaMB.filmesEmCartaz}"/>
</h:body>
</html>
O outputText irá chamar o método getFilmesEmCartaz() da managed bean CinemaMB, que chama o web service REST que traz todos os filmes em cartaz.
Para utilizar a API do Jersey dentro da aplicação, clique com o botão direito do mouse em cima do nome do projeto e escolha o item Propriedades. Na tela de propriedades acesse a categoria Bibliotecas e adicione a biblioteca Jersey 1.8 (JAX-RS RI) através do menu Adicionar Biblioteca como mostrado na figura a seguir:
Vamos criar a managed bean CinemaMB com a implementação do método:
package br.metodista.managedbean;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.WebResource;
import javax.faces.bean.ManagedBean;
@ManagedBean
public class CinemaMB {
public String getFilmesEmCartaz() {
Client c = Client.create();
WebResource wr = c.resource(
"http://localhost:8080/MeuCinema/webresources/filmes");
return wr.get(String.class);
}
}
Com a classe Client é possível obter um resource web (recurso web) através da URL do web service REST, e com esse recurso é possível chamar os métodos que o web service REST suporta, como: get, post, put, delete, etc.
Ao chamar o método wr.get(String.class)
, estamos esperando que a chamada para esse serviço devolva uma String, nesse exemplo essa String vem no formato JSON (JavaScript Object Notation), mas poderia ser uma String simples, um formato XML, etc. Ao executar a aplicação CinemaJSF teremos a tela da figura a seguir:
Para converter esse JSON em objeto Java, podemos usar uma API simples do Google chamada GSon (https://code.google.com/p/google-gson) que realiza essa conversão de maneira fácil. Primeiro vamos criar a classe Filme que irá representar cada filme da lista:
package br.metodista.modelo;
public class Filme {
private Long id;
private String filme;
private String sinopse;
private String genero;
private Integer duracao;
private String trailer;
public Filme() {
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getFilme() {
return filme;
}
public void setFilme(String filme) {
this.filme = filme;
}
public String getSinopse() {
return sinopse;
}
public void setSinopse(String sinopse) {
this.sinopse = sinopse;
}
public String getGenero() {
return genero;
}
public void setGenero(String genero) {
this.genero = genero;
}
public Integer getDuracao() {
return duracao;
}
public void setDuracao(Integer duracao) {
this.duracao = duracao;
}
public String getTrailer() {
return trailer;
}
public void setTrailer(String trailer) {
this.trailer = trailer;
}
}
Adicione a biblioteca do gson no projeto, clique com o botão direito do mouse em cima do nome do projeto e escolha o item Propriedades. Na tela de propriedades acesse a categoria Bibliotecas e adicione a biblioteca gson-2.2.2.jar através do menu Adicionar JAR / Pasta.
Vamos alterar o CinemaMB para utilizar a API do gson e converter o JSON em uma lista de filmes:
package br.metodista.managedbean;
import br.metodista.modelo.Filme;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.WebResource;
import java.util.List;
import javax.faces.bean.ManagedBean;
@ManagedBean
public class CinemaMB {
public List<Filme> getFilmesEmCartaz() {
Client c = Client.create();
WebResource wr = c.resource
("http://localhost:8080/MeuCinema/webresources/filmes");
String json = wr.get(String.class);
Gson gson = new Gson();
return gson.fromJson(json,
new TypeToken<List<Filme>>() {}.getType());
}
}
Agora vamos mudar a página index.xhtml para mostrar uma tabela com os filmes:
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<h:head>
<title>Meu Cinema</title>
</h:head>
<h:body>
<h1>Filmes em cartaz</h1>
<h:dataTable value="#{cinemaMB.filmesEmCartaz}"
var="f" width="100%">
<h:column>
<f:facet name="header">
<h:outputText value="Titulo"/>
</f:facet>
<h:outputText value="#{f.filme}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Genero"/>
</f:facet>
<h:outputText value="#{f.genero}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Duração"/>
</f:facet>
<h:outputText value="#{f.duracao} min"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Sinopse"/>
</f:facet>
<h:outputText value="#{f.sinopse}"/>
</h:column>
</h:dataTable>
</h:body>
</html>
A tela ficará com a seguinte aparência: