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.

Exemplo REST Filmes

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.

Novo WS REST

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.

Novo WS REST

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.

Novo WS REST

A estrutura do projeto ficará com a seguinte aparência:

Novo WS REST

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.

Exemplo REST 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.

Novo WS REST

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:

Adicionando a biblioteca Jersey

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:

Cliente REST JSF

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.

Novo cliente JSF

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:

Cliente REST em JSF

results matching ""

    No results matching ""