Java

 Agenda de Contatos (REST)

Trabalho da Disciplina: Tecnologia WebServices e RESTful
Prof. Carlos L. L. Rischioto

MBA em Desenvolvimento de Aplicações Java - SOA / FIAP
18/12/2011

Adriana Del Nero Romano
Robson de Sousa Martins


Download do código-fonte:

Agenda de Contatos (REST) (ZIP ~18,1MB)


Tecnologias empregadas:

  • Restlet;
  • XML;
  • JAXB;
  • JPA;
  • SQLite;
  • UI em modo console (consumer).

Enunciado:

Com base no WebService desenvolvido no exercício anterior, desenvolva uma interface RESTful para o mesmo serviço.

Deverão ser construídos e entregues os seguintes artefatos:

  1. Classe Application, com a definição de todas as URIs.
  2. Classes Resoures para todas as entidades necessárias.
  3. Deployment Descriptor (web.xml) do projeto.

Arquivos do Pacote ZIP:

  • AgendaRestEclipseProject.zip: Projeto Java para o Eclipse, contendo um Servidor REST Standalone para a Agenda de Contatos.
  • AgendaRestWebProject.war: Projeto Java Web, contendo um Servlet REST para a Agenda de Contatos.
  • AgendaRestClientEclipseProject.zip: Projeto Java para o Eclipse, contendo um Cliente em Modo Console (CUI) para a Agenda de Contatos.

Detalhes sobre a Implementação:

O Servidor REST da Agenda de Contatos foi implementando de duas formas:

  1. Servidor Standalone (usando Restlet JavaSE Edition): Neste projeto, o servidor é iniciado a partir de um programa Java convencional, não necessitando de um contêiner Web para rodar. Nesse caso, não há um arquivo web.xml.
  2. Servlet Web (usando Restlet JavaEE Edition): Neste projeto Java Web, o servidor é iniciado a partir de um conteiner Web (Tomcat, por exemplo). Nesse caso, deve ser feito um deploy do projeto para o Servidor de Aplicações.

Nos dois casos, a implementação do bean (POJO) Contato sofreu uma alteração (com relação ao Exercício WebService anterior): O Identificador do Contato passou a ser numérico (id) ao invés de ser o e-mail, para facilitar a escrita da URL no protocolo HTTP (REST).

Em ambos os servidores REST implementados, a serialização dos objetos é realizada por meio de um JaxbRepresentation (Uma extensão do Restlet que permite o uso do JAXB para transformar objetos em XML e vice-versa).

Para representar uma lista de Contatos, foi criado um bean (POJO) chamado Agenda, que possui um List<Contato>.

URL's do Serviço REST:

As URL's definidas no Servidor REST da Agenda são as seguintes:

http://<host>[:port]/agenda/contatos

Através do GET a essa URL, é obtida a lista de contatos em XML (método listar()).
Através do POST de um XML a essa URL, é inserido um contato (método inserir()).

http://<host>[:port]/agenda/contatos/{idContato}

Através do GET a essa URL, é obtido o contato em XML (método consultar()).
Através do DELETE a essa URL, é excluído um contato (método excluir()).

http://<host>[:port]/agenda

Idêntico ao http://<host>[:port]/agenda/contatos


Exemplos de XML
:

XML da Agenda (lista de Contatos):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<contatos>
    <contato id="1">
        <nome>Adriana Del Nero</nome>
        <email>adriana@adriana.com.br</email>
        <endereco>Av. dos Sonhos, 6433 - Apto. 603</endereco>
        <cidade>São Paulo</cidade>
        <estado>SP</estado>
        <pais>Brasil</pais>
        <telefone>8989-8484</telefone>
    </contato>
    <contato id="2">
        <nome>Robson Martins</nome>
        <email>robson@robson.com.br</email>
        <endereco>Rua das Flores, 632</endereco>
        <cidade>Salvador</cidade>
        <estado>BA</estado>
        <pais>Brasil</pais>
        <telefone>7070-7060</telefone>
    </contato>
</contatos>

XML de um Contato:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<contato id="1"> <!—- se contato vai ser inserido, id pode ser omitido --!>
    <nome>Adriana Del Nero</nome>
    <email>adriana@adriana.com.br</email>
    <endereco>Av. dos Sonhos, 6433 - Apto. 603</endereco>
    <cidade>São Paulo</cidade>
    <estado>SP</estado>
    <pais>Brasil</pais>
    <telefone>8989-8484</telefone>
</contato>


Servidor REST Agenda (Standalone):

O Servidor REST Standalone da Agenda foi implementado utilizando a edição JavaSE do Restlet, e não necessita de instalação em um Servidor de Aplicações.

A persistência dos dados foi implementada com o uso de JPA, sobre o SQLite 0.56.

A classe Contato em br.com.fiap.agenda é o bean (POJO), persistido pelo JPA e gerenciado pelo servidor REST.

A classe Agenda em br.com.fiap.agenda representa uma lista de Contatos, usada pelo JAXB para representar essa lista como um XML.

As classes em br.com.fiap.dao são DAO's para manipular os beans persistidos via JPA.

A classe GenericDAO é uma classe abstrata que implementa os métodos básicos para acesso ao banco de dados com JPA, e a classe ContatoDAO é a especialização responsável pelo acesso aos objetos persistidos da classe Contato.

Na classe GenericDAO existe um atributo 'debugInfo' que pode ser alterado para true para imprimir no console as informações de debug (default = false).

As classes em br.com.fiap.rest implementam o Serviço REST:

  • AgendaServerMain: Inicializa o servidor REST na porta TCP 8888 (default).
  • AgendaApplication: Aplicação REST da Agenda, contém o Router e define as URL’s.
  • AgendaResource: Manipula as requisições feitas sobre a Agenda.
  • ContatoResource: Manipula as requisições feitas sobre um Contato.


Servidor Web REST Agenda:

O Servidor Web REST da Agenda foi implementado utilizando a edição JavaEE do Restlet e, por ser um Servlet, necessita de um contêiner Web (como o Tomcat, por exemplo).

A implementação desse servidor é semelhante ao Servidor Standalone, porém a classe br.com.fiap.rest.AgendaServerMain não existe. Além disso, há um arquivo web.xml que declara o Servlet disponibilizado pelo framework Restlet e define a classe AgendaApplication como a aplicação desse Servlet.


Consumidor (Cliente) da Agenda:

A aplicação consumidora do REST da Agenda foi implementada usando uma UI em modo console (CUI), adaptada da mesma aplicação usada no Exercício de WebService anterior.

As classes que implementam a aplicação consumidora estão no pacote br.com.fiap.cliente, sendo que a principal é a AgendaClient, onde está o método main().


Instruções para funcionamento das aplicações:

As instruções a seguir pressupõem que os projetos serão executados a partir do Eclipse:

Servidor REST Standalone e Cliente:
  1. Importar o projeto no arquivo AgendaRestEclipseProject.zip para um Workspace do Eclipse (Servidor Standalone da Agenda);
  2. Importar o projeto no arquivo AgendaRestClientEclipseProject.zip para um Workspace do Eclipse (Cliente da Agenda);
  3. Executar a aplicação do Servidor, através da classe AgendaServerMain do pacote br.com.fiap.rest.
    O Servidor REST estará então ouvindo na porta TCP 8888 (default). É recomendável "pinar" a visualização do Console (Pin Console);
  4. Abrir uma nova visualização de Console no Eclipse, e executar a aplicação cliente, através da classe AgendaClient do pacote br.com.fiap.cliente.
    É recomendável também "pinar" essa visualização do Console (Pin Console);
  5. Especificar a URL base do servidor REST (default: http://localhost:8888/agenda) – para aceitar o default, pressionar ENTER duas vezes;
  6. Um menu em modo console é exibido, e poderá ser utilizado para invocar as operações previstas para essa aplicação.

Servidor REST Web e Cliente:

  1. Importar o projeto no arquivo AgendaRestWebProject.war para um Workspace do Eclipse (Servlet Web da Agenda). Deverá ser criado um Runtime e um Server para o Tomcat, por exemplo;
  2. Importar o projeto no arquivo AgendaRestClientEclipseProject.zip para um Workspace do Eclipse (Cliente da Agenda);
  3. Executar a aplicação (Run as / Run on Server). É recomendável "pinar" a visualização do Console (Pin Console).
    Note que a aplicação web da Agenda estará rodando a partir de http://localhost:8080/Exercicio-Rest-Agenda-Web/agenda
  4. Abrir uma nova visualização de Console no Eclipse, e executar a aplicação cliente, através da classe AgendaClient do pacote br.com.fiap.cliente.
    É recomendável também "pinar" essa visualização do Console (Pin Console);
  5. Especificar a URL base do servidor REST (http://localhost:8080/Exercicio-Rest-Agenda-Web/agenda);
  6. Um menu em modo console é exibido, e poderá ser utilizado para invocar as operações previstas para essa aplicação.
    Nota: Na aplicação Web sendo rodada a partir do Eclipse, o arquivo de persistência do SQLite (agenda.db) será criado no diretório base de instalação do Eclipse, e não dentro do contexto da aplicação.

Versões das ferramentas e bibliotecas utilizadas:

  • Eclipse 3.6
  • Java JDK 1.6
  • SQLite 0.56
  • JPA 2 / Hibernate 3
  • Restlet 2.0.10
  • Tomcat 6
  • NetTool 4.7.2