Escolar Documentos
Profissional Documentos
Cultura Documentos
Nos últimos tempos, uma forte tendência vem mudando a forma de pensar os Web Services. Ela aponta para uma
solução que elimina a complexidade presumida presente nos padrões dos Web Services convencionais, conhecidos
também como Web Services SOAP ou Web Services WS-* (nomenclatura dada devido usarem diversas tecnologias
diferentes). Esta tendência é o REST (REpresentational StateTransfer).
REST significa Representational State Transfer. Em português, Transferência de Estado Representacional. Trata-se de
uma abstração da arquitetura da Web. Resumidamente, o REST consiste em princípios/regras/constraints que, quando
seguidas, permitem a criação de um projeto com interfaces bem definidas. Desta forma, permitindo, por exemplo,
que aplicações se comuniquem.
Existe uma certa confusão quanto aos termos REST e RESTful. Entretanto, ambos representam os mesmos princípios.
A diferença é apenas gramatical. Em outras palavras, sistemas que utilizam os princípios REST são chamados de
RESTful.
2. Princípios REST
Os princípios utilizados por REST permitem que utilizemos a arquitetura da Web a nosso favor. Para REST, qualquer
informação disponível é um recurso, por exemplo, um documento, o cadastro de uma pessoa, uma imagem, uma lista
de carros. Este é um princípio, mas existem outros não menos importantes. São eles:
1
INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA DO MARANHÃO
CAMPUS SÃO LUÍS – MONTE CASTELO
DIRETORIA DE ENSINO SUPERIOR
DEPARTAMENTO ACADÊMICO DE INFORMÁTICA
No exemplo, podemos ver que estamos acessando uma venda, porém, ela permite que ao seguirmos um link, como o
de cliente, estamos mudando o estado da aplicação.
Interface Uniforme
A URI ainda permite outras vantagens. Aliada aos métodos do HTTP, a URI sabe que todos os recursos suportam a
mesma interface, o mesmo conjunto de métodos HTTP. O HTTP possui outros verbos, além dos conhecidos GET e
POST, são eles: PUT, DELETE, HEAD e OPTIONS. Esses métodos permitem que se obtenha uma interface uniforme,
associa estes verbos a necessidades de aplicativo de negócios padrão, mais conhecido por CRUD (do inglês Create,
Retrieve, Update, Delete), ou seja, armazenamento, busca, atualização e deleção. A tabela 1 mostra esta associação.
Ao associar os verbos HTTP, que na realidade são solicitações, aos recursos, que agem como nomes, obtêm-se uma
semântica conversacional. Por exemplo, pode-se criar uma expressão lógica de comportamento, GET este documento
e UPDATE aquele registro.
A desvantagem é a redução de desempenho na rede devido aumenta os dados repetidos enviados nas requisições, e
o controle do servidor sobre a consistência da aplicação é reduzido, já que todo o estado da aplicação fica no lado
cliente.
Os web services podem ser implementados de muitas maneiras diferentes, cada uma com vantagens e desvantagens
próprias da solução técnica adotada. Em sistemas desenvolvidos utilizando-se a linguagem Java existem duas soluções,
que na documentação da Oracle; são denominadas como Big Web Services e RESTful Web Services. Tanto os web
services Big quanto os RESTful fazem parte da API Java para XML (Java API for XML — JAX), que foi introduzida ao Java
SE na versão 5.
A solução denominada Big Web Services é baseada na troca de mensagens codificadas em XML e utiliza o Protocolo
de Acesso Simples a Objetos (Simple Object Access Protocol — SOAP), cujo padrão é mantido pela W3C.
Já os web services RESTful (Representational State Transfer) são mais adequados para a utilização em cenários mais
básicos, e também são melhor adaptados ao uso do protocolo HTTP do que os serviços SOAP. Os serviços RESTful são
mais leves, o que significa que podem ser desenvolvidos com menor esforço, tornando-os mais fáceis de serem
adotados como parte da implementação de um sistema.
Devido a ascendente utilização de REST, a plataforma Java incorporou este conceito por meio da especificação JAX-RS
1.1, baseada em anotações. Esta especificação determina como deve ser implementado um serviço Restful, porém,
não o implementa. Para implementar facilmente os Web Services Restful, é necessário se utilizar um framework como
o RESTeasy, o RESTlet, restfulie ou Jersey. Em nosso caso, usaremos um servidor de aplicações que já implementa
internamente o RESTeasy.
Para que o servidor de aplicações possa prover serviços RESTful, além da implementação do próprio serviço, é
necessário também que esteja disponível a implementação da API JAX-RS, na qual estão disponíveis os serviços e as
classes que definem as anotações e os seus correspondentes comportamentos, tornando possível a ligação entre as
solicitações dos clientes e os recursos do web service publicado. A implementação de referência da API JAX-RS é o
3
INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA DO MARANHÃO
CAMPUS SÃO LUÍS – MONTE CASTELO
DIRETORIA DE ENSINO SUPERIOR
DEPARTAMENTO ACADÊMICO DE INFORMÁTICA
Jersey, um projeto de código aberto, portável, com qualidade, que está agora em sua versão 2.23 e que contempla as
JSRs 311 e 339, que dizem respeito aos web services RESTful.
3. Anotações JAX-RS
O padrão RESTful faz uso de anotações para facilitar o desenvolvimento dos web services, de modo que a declaração
dos recursos e ações que poderão ser realizadas sejam especificadas utilizando esses metadados nos membros da
classe. Algumas das anotações mais utilizadas, definidas pela API JAX-RS, estão listadas abaixo, juntamente com uma
breve explicação a respeito do seu significado e de como são inseridas no código.
@Path
Informa o valor de uma URI relativa, que determina o caminho no qual a classe ou método será hospedado no servidor.
Além da especificação do caminho do recurso é possível também incluir a definição de variáveis nas URIs, como o
nome do usuário manuseando o sistema ou os parâmetros a serem utilizados durante a execução da requisição
enviada pelo cliente.
@GET
Essa anotação é um designador de método de pedido (Request Method Designator), que corresponde ao método HTTP
de mesmo nome, e determina que o método da classe anotado processe e responda às solicitações GET recebidas. O
resultado esperado é que o serviço retorne o valor correspondente ao recurso solicitado, que pode ser o conteúdo de
um atributo, os registros de uma tabela em uma base de dados, o resultado de algum cálculo, entre outras
possibilidades.
@POST
Essa anotação também é um designador de método de pedido e determina que o método da classe anotado processe
e responda às solicitações POST recebidas. Como resultado de uma requisição POST é esperada a alteração do valor
ou estado de algum recurso disponibilizado pelo serviço, que pode ser um registro em uma base de dados, o conteúdo
de um arquivo, entre outros.
@PUT
Essa anotação também é um designador de método de pedido e determina que o método da classe anotado processe
e responda às solicitações PUT recebidas. O uso de uma requisição PUT objetiva a criação de um recurso pelo serviço,
que pode ser um arquivo, um registro em um arquivo ou em uma base de dados, entre tantas outras situações
possíveis.
@DELETE
Esta anotação também é um designador de método de pedido e determina que o método da classe anotado processe
e responda às solicitações DELETE recebidas. O resultado esperado para uma requisição DELETE é a eliminação ou
destruição do recurso correspondente, ou seja, corresponde à eliminação do conteúdo de um registro em uma base
de dados ou à remoção de um arquivo de dados, conforme a especificação utilizada na implementação do serviço.
@PathParam
Essa anotação designa um parâmetro que está na URI de requisição do serviço. O nome e posição dos parâmetros na
URI são determinados pelo modelo definido pela anotação @Path.
@QueryParam
4
INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA DO MARANHÃO
CAMPUS SÃO LUÍS – MONTE CASTELO
DIRETORIA DE ENSINO SUPERIOR
DEPARTAMENTO ACADÊMICO DE INFORMÁTICA
Essa anotação designa um parâmetro que está na parte de parâmetros de busca da URI enviada pelo cliente. Os
parâmetros definidos dessa forma não necessitam estar especificados no modelo da URI definido pela anotação
@Path.
@Consumes
É uma anotação para especificar o tipo de dado que um recurso pode consumir, ou seja, que o cliente pode enviar ao
serviço. Os tipos de dados dessa anotação são especificados usando-se os tipos do padrão MIME.
@Produces
Essa é uma anotação para especificar o tipo de dados que um recurso pode produzir e enviar para o cliente em resposta
a uma solicitação. Os tipos de dados dessa anotação também são especificados usando-se os tipos do padrão MIME.
Para criar nosso Web Service REST iremos usar as mesmas ferramentas que usamos na prática de Web Services SOAP:
Iremos nesta prática desenvolver um serviço REST para uma empresa chamada BoaMúscia. Esta empresa possui várias
rádios espalhadas pelo Brasil. Um dos programas mais esperados pelos ouvintes é o Top10, um programa que toca as
10 músicas mais pedidas durante um determinado mês. Geralmente a lista envolve vários tipos de artistas e estilos
bem diferentes. Uma empresa chamada SóCDLegal, sabendo da audiência do programa Top10 resolve lançar CDs com
as músicas mais tocadas em cada Rádio da empresa BoaMúsica. Assim a empresa SóCDLegal necessita todo mês da
lista Top10 de cada rádio da empresa BoaMúsica. A empresa BoaMúsica possui uma aplicação desenvolvida em C#
que gerencia os dados relacionados ao Top10 de cada rádio. A Figura 2 apresenta a Tela de Cadastro de Rádios desta
aplicação. E a Figura 3 apresenta a Tela que monta o Top10 de uma determinada rádio.
5
INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA DO MARANHÃO
CAMPUS SÃO LUÍS – MONTE CASTELO
DIRETORIA DE ENSINO SUPERIOR
DEPARTAMENTO ACADÊMICO DE INFORMÁTICA
Na Figura 3 podemos perceber que a tela para manutenção dos Top10 é um pouco mais complexa que a de Cadastro
de Rádios, pois seu uso envolve a definição de vários elementos (artista, música, posição, etc).
Um novo grupo de Profissionais de TI foi contratado pela Empresa BoaMúsica, e esta equipe propõe uma solução
baseada em REST que fará com que a lista de Top10 salva pelas Rádios da Empresa BoaMúsica, sejam
automaticamente disponibilizadas para a empresa SóCDLegal. A equipe é especializada em Java e propõe que seja esta
a tecnologia utilizada para implementação do serviço REST. A proposta é apresentada ao segmento de negócios da
BoaMúsica e ela concorda com a proposta do pessoal de TI.
Para a prática devem ser seguidos os seguintes passos para a criação da aplicação Provedora de Serviços.
1. Fazer download do arquivo WAR1 disponibilizado no site da disciplina (Aplicação Radio Web Service);
2. Fazer download do Modelo de Dados da aplicação (Modelo de Dados da Aplicação Radio Web Service);
3. Fazer download do arquivo de carga de dados para a base de dados.
1
WAR: Um arquivo WAR é um arquivo JAR (Java ARchive) salvo com uma extensão diferente. Arquivos deste tipo possuem
dentro dele, normalmente, toda a estrutura e arquivos relacionados a uma aplicação web desenvolvida em Java.
6
INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA DO MARANHÃO
CAMPUS SÃO LUÍS – MONTE CASTELO
DIRETORIA DE ENSINO SUPERIOR
DEPARTAMENTO ACADÊMICO DE INFORMÁTICA
7
INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA DO MARANHÃO
CAMPUS SÃO LUÍS – MONTE CASTELO
DIRETORIA DE ENSINO SUPERIOR
DEPARTAMENTO ACADÊMICO DE INFORMÁTICA
Para que a aplicação Provedora REST possa ser desenvolvida é necessário que seja criado o banco de dados baseado
neste modelo. Em nossa página disponibilizamos o modelo de dados, que após ser baixado deverá ser aberto na
ferramenta MySqlWorkbench (de preferência). Através do MySqlWorkbench podemos realizar um “forward
engineer” (opção disponível no menu Database), que transforma o modelo aberto em uma base de dados. Em nossa
página também foi disponibilizado um arquivo (cargaSQLRadioWebService.txt) que possui uma série de INSERTs que
promovem a carga na base de dados com algumas rádios e um Top10 de uma rádio. Realizados todos estes passos,
podemos então desenvolver a nossa aplicação provedora de serviços REST.
8
INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA DO MARANHÃO
CAMPUS SÃO LUÍS – MONTE CASTELO
DIRETORIA DE ENSINO SUPERIOR
DEPARTAMENTO ACADÊMICO DE INFORMÁTICA
Observando a Figura 6, podemos perceber a simplicidade do método retornaRadioporId(). Ele faz uso da classe
DAORadio. A classe DAORadio já possui em sua implementação um método que realiza exatamente o que queremos.
Outra observação ou até mesmo um questionamento que pode ser feito é: A classe RadioWebServices é uma classe
Java comum, como pode ela representar um Provedor de Serviços REST? Bem, a resposta é simples: Iremos
transformar esta classe Java comum em um Provedor de Serviços REST incluído nela as anotações JAX-RS apresentadas
anteriormente. A Figura 7 apresenta a mesma classe RadioWebServices, porém com as anotações JAX-RS que
transformam esta classe em um Provedor de Serviços REST.
• Da linha 3 a linha 7 são feitos os imports das diversas classes que são usadas na implementação de um serviço
REST usando Java (JAX-RS). Temos de ter cuidado com estes imports pois há várias APIs disponibilizadas junto
ao Eclipse que possuem classes com estes mesmos nomes (Path, PathParam, etc). Todos os nossos imports
tem como raiz: “javax.ws.rs”;
• Na linha 12 temos a definição do nosso recurso através da anotação @Path aplicada a classe. Na verdade,
temos a estruturação do caminho que será usado para se chegar aos serviços disponibilizados junto a este
recurso.
• Na linha 15 temos a anotação que informa qual verbo HTTP este nosso serviço será associado. Como o serviço
recupera um recurso (Radio), iremos usar a anotação @GET.
• Na linha 16 temos a definição do nosso subrecurso através da anotação @Path, só que desta vez aplicada ao
método. Na verdade, temos a estruturação do caminho que será usado para se chegar ao serviço
disponibilizado por este método.
• Na linha 17, devido a este serviço retornar um recurso, precisamos informar em que formato de dados este
recurso será retornado. Para tal finalidade, usamos a anotação @Produces em conjunto com o ENUM
MediaType para definir o nosso retorno de objeto Radio em formato JSON.
• Na linha 18 fazemos uso da anotação @PathParam, para indicar à URL do recurso que estamos construindo,
que teremos um parâmetro e este possui um nome, id. Perceba que no @Path(“radio/{id}”), este {id} é o
mesmo id que esta indicado na anotação @PathParam, ou seja, eles devem ter o mesmo nome.
10
INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA DO MARANHÃO
CAMPUS SÃO LUÍS – MONTE CASTELO
DIRETORIA DE ENSINO SUPERIOR
DEPARTAMENTO ACADÊMICO DE INFORMÁTICA
Para fazermos uso desta classe, que nos auxiliará no processo de fazer o deploy do nosso web services REST, devemos
realizar algumas alterações. A classe em si, tem um código padrão e que desta forma o aluno não precisa se preocupar
com a sua implementação, fazendo apenas as alterações apontadas aqui. A 1ª alteração é a mudança do nome do
pacote a qual a classe estará sendo copiada (linha 1). Mudaremos o nome do pacote de “nossoservico” para
“recursos”. A 2ª alteração é a modificação do conteúdo da anotação @ApplicationPath (linha 9). Este conteúdo fará
parte da composição da URL dos serviços gerenciados por esta aplicação. Na classe o conteúdo é “webservices”,
alteraremos ele para “boamusicaservice”. A terceira alteração e mais importante, iremos alterar na linha 24 o
argumento da chamada resources.add() para o nome da nossa classe que implementa o nosso Provedor de Serviços
REST. E caso você venha a ter mais classes Provedores de Serviços REST, para fazer o deploy delas, basta adicionar
resources.add() a este método passando como argumento o nome da classe que implementa o Provedor de Serviços.
A Figura 9 apresenta a classe ApplicationConfig.java após as modificações.
11
INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA DO MARANHÃO
CAMPUS SÃO LUÍS – MONTE CASTELO
DIRETORIA DE ENSINO SUPERIOR
DEPARTAMENTO ACADÊMICO DE INFORMÁTICA
5. Conclusão
Demonstramos aqui em passos simples como criamos um Web Services REST usando a API disponibilizada pelo JAX-
RS. Esperamos que os alunos possam reproduzir estes passos e possam compreender a forma como o Java trabalha
com a implementação de Web Services. Para completar esta prática o aluno deverá implementar o serviço solicitado
pela empresa SóCDLegal.
Referências
https://www.devmedia.com.br/introducao-a-web-services-restful/37387
https://www.devmedia.com.br/introducao-ao-rest-ws/26964
https://becode.com.br/o-que-e-api-rest-e-restful/
https://www.infoq.com/br/articles/rest-introduction
12