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> <head> <title>Sílvio Bacalá Jr</title> <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