Web Services REST
Web Service • Serviço oferecido por um sistema que pode ser
acessado diretamente por outro sistema desenvolvido em qualquer tecnologia através de uma rede como a internet.
• Cada plataforma oferece os recursos necessários para que os desenvolvedores possam disponibilizar ou acessar web services.
• A W3C define alguns padrões para definir o funcionamento de um web service.
• A especificação Java relacionada a Web Services que seguem os padrões da W3C é a Java API for XML-Based Web Services - JAX-WS.
2
Web Services
• Como alternativa, é possível desenvolver web services seguindo os princípios do estilo arquitetural REST (Representational State Transfer ).
• Em geral, web services REST são mais fáceis de implementar e evoluir.
• Na plataforma Java, há especificações que definem o modelo de programação de web services Java que seguem os princípios REST.
• A principal especificação para esse tipo de web service é a API for RESTfulWeb Services JAX-RS. 3
Resources, URIs,Media Types
• Resource : qualquer informação disponível
• Exemplos de resources: • O cadastro de uma pessoa,
• uma imagem,
• um documento e a
• cotação de uma moeda.
• Deve possuir um identificador único. Esse identificador será utilizado para que o resource possa ser acessado.
• URI (Uniform Resource Identifier) : identificador de um web resources na internet ou em uma intranet
• Media Type: formas de representação de resources.
• Na web é normal que o cadastro de uma pessoa possa ser obtido em html, xml e json.
4
HTML, XML e JSON
<html> <head> <title>Sílvio Bacalá Jr</title> <head> <body> <h1>Sílvio Bacalá Jr</h1> <p>esse cara sou eu!</p> </body> </html> <pessoa> <nome>Sílvio Bacalá Jr</nome> <descricao>esse cara sou eu!</descricao> </pessoa> {"nome": "Sílvio Bacalá Jr", "descricao": "esse cara sou eu!"}
5
Operações
• Em uma arquitetura REST, um conjunto pequeno e fixo de operações deve ser definido previamente.
• As operações são utilizadas para manipular os recursos de alguma forma.
• Os recursos são manipulados pelos métodos do protocolo HTTP. Podemos atribuir uma semântica diferente para cada método HTTP.
• Exemplo: • usamos o GET para pegar a lista de clientes,
• usamos o POST para adicionar um cliente na lista.
6
Web service com JAX-RS
• A especificação JAX-RS define um modelo de programação para a criação de web services restful (web service que seguem os princípios do estilo arquitetural REST).
7
Resources
• De acordo com a JAX-RS, os web resources são implementados por classes Java.
• Todo web resource deve possuir uma URI que é definida parcialmente pela anotação @Path.
8
Resources
• Os métodos HTTP podem ser mapeados para métodos Java de uma classe. As anotações
• @GET, @PUT, @POST, @DELETE e @HEAD são utilizadas para realizar esse mapeamento.
9
Resources
• Media Type, utilizado para a representação
do resource, pode ser definido através da
anotação @Produces e o do enum MediaType.
10
Subresource
• A princípio, uma classe define apenas um resource. Porém, podemos definir subresources dentro de uma classe através de métodos anotados com @Path.
11
Subresource • O sufixo da URI de um subresource é definido pela
concatenação do valor da anotação @Path aplicada na classe com o valor da anotação @Path aplicada no método correspondente ao subresource.
• No exemplo mostrado, temos dois subresources com URI que possuem os seguintes sufixos:
• /Cotacao/DollarToReal
• /Cotacao/EuroToReal.
12
Exercício: Criar um WS-REST no NetBeans • Criar um projeto Aplicação Web umrest
13
• No projetos, com o botão direito crie
14
15
16
• Agora, é preciso indicar o caminho para que o serviço seja invocado automaticamente.
• Chame a aba do projeto com o botão direito e selecione Propriedades (lá embaixo). 17
• Selecione em Executar para escolher URL relativo.
• A URL completa é do tipo http://localhost:8080/projeto/webresources/service
• Nosso serviço é cotacao
• webresource é a parte do caminho atualizada na @javax.ws.rs.ApplicationPath("webresources"), no arquivo ApplicationConfig.java criado pelo NetBeans.
• A URL relativa será /websource/cotacao
• Se preferir, pode deixar apenas uma “/” para eliminar webresource da URL e ficar apenas /cotacao
18
19
Testando o WebService
• http://localhost:8084/umrest/cotacao/
• Implemente agora a consulta usando subresources
• DolarToReal e EuroToReal
20
Parâmetros
PathParam
• Suponha que desejamos utilizar URIs com o seguinte formato para realizar a cotação de moedas
• /Cotacao/Dollar/Real: Valor do Dollar em Real.
• /Cotacao/Euro/Real: Valor do Euro em Real.
• /Cotacao/Moeda1/Moeda2: Valor da Moeda1 na Moeda2
• Para trabalhar com uris com esse formato, podemos definir parâmetros na URI de um resource através da anotação @PathParam.
@Path {"/{ M1 }/{ M2}"}
21
Parâmetros
• http://localhost:8080/path-param/1/2 • http://localhost:8080/path-param/java/csharp
22
MatrixParam
• Suponha que desejamos utilizar uris com o seguinte formato para realizar a cotação de moedas
/Cotacao;M1=dollar;M2=real: Valor do Dollar em Real.
/Cotacao;M1=euro;M2=real: Valor do Euro em Real.
• As URIs acima possuem dois matrix params: M1 e M2. Esses parâmetros podem ser recuperados através da anotação @MatrixParam
public String cotacao ( @MatrixParam ("M1") String m1 ,
@MatrixParam ("M2") String m2){ 23
MatrixParam
• http://localhost:8080/matrix-param;p1=1;p2=2 • http://localhost:8080/matrix-param;p1=java;p2=csharp 24
QueryParam
• Suponha que desejamos utilizar uris com o seguinte formato para realizar a cotação de moedas
/Cotacao?M1=dollar&M2=real: Valor do Dollar em Real.
/Cotacao?M1=euro&M2=real: Valor do Euro em Real.
• As URIs acima possuem dois query params: M1 e M2. Esses parâmetros podem ser recuperados através da anotação @QueryParam
public String cotacao ( @QueryParam ("M1") String m1 ,
@QueryParam ("M2") String m2){ 25
QueryParam
• http://localhost:8080/query-param?p1=1&p2=2 • http://localhost:8080/query-param?p1=java&p2=csharp
26
FormParam
• Parâmetros enviados através de formulários HTML que utilizam o método POST do HTTP podem ser recuperados através da anotação @FormParam.
27
HeaderParam
• Os headers HTTP podemser recuperados através da anotação @HeaderParam.
28
CookieParam
• Os valores dos cookies enviados nas requisições HTTP podem ser recuperados através da anotação @CookieParam.
29