Web Services REST JAX-RS Professor: Ricardo Luis dos Santos IFSUL 2015
Agenda Principais tecnologias envolvidas Testando os serviços desenvolvidos JAX-RS Principais anotações JAX-RS Principais anotações JAXB Entendendo o Web Service Configurar o ambiente Exemplo de Web Services REST Exercício 2
Principais tecnologias envolvidas JAX-RS é uma especificação que permite criar RESTful Web services (análoga a JAX-WS para SOAP) Jersey é a principal implementação da especificação JAX-RS JAXB (Java Architecture for XML Binding) permite parsear objetos para arquivos XML ou JSON Tomcat é o servidor Web utilizado para executar as aplicações Java 3
Testando os serviços desenvolvidos HttpRequester (Firefox) 4
Testando os serviços desenvolvidos DHC (Chrome) 5
Testando os serviços desenvolvidos Soap UI (Vários SOs Linux, Windows e Mac OS) 6
JAX-RS Objetivo Foco em POJOs Explorar bem o HTTP Independência de formato Independência de container Descrição A API vai oferecer um conjunto de anotações e classes/interfaces associadas que possam ser usadas com POJOs para expô-los como recursos Web HTTP é assumido como o protocolo de aplicação, permitindo utilizar os diferentes métodos implementados no protocolo A API permitirá o uso de diversos content-types. O suporte aos content-types será feito de uma forma plugável que defina uma forma padrão de extensão para o suporte a novos tipos de conteúdo Será possível o deployment em qualquer servidor de aplicações Java EE e também nos containers de Servlets 7
Principais anotações JAX-RS Para acessar recursos são definidas diversas anotações correspondentes aos métodos HTTP @GET Implementa um WS para obter informações de um recurso @POST Implementa um WS para criar um recurso @PUT Implementa um WS para atualizar um recurso @DELETE Implementa um WS para deletar um recurso Elas devem ser atribuídas a métodos públicos As principais anotações estão presentes no pacote javax.ws.rs 8
Principais anotações JAX-RS @Path( /repositorio/{id} ) Pode ser colocada na declaração de classe ou de um método e possui o elemento value obrigatório Por este elemento definimos o prefixo da URI que a classe ou o método irá atender Aqui a URI relativa /repositorio/{id}, na qual {id} é o valor do parâmetro id, fornecido junto a URI Geralmente incluída na declaração de um método quando queremos atribuir um caminho mais específico para um recurso, de forma a especializar nosso método 9
Principais anotações JAX-RS @Produces 10 Especifica os tipos MIME que o método produzirá como resposta para o cliente @Consumes Especificas os tipos MIME que o método pode receber do cliente Para ambos podemos utilizar MediaType.APPLICATION_XML MediaType.APPLICATION_JSON MediaType.TEXT_PLAIN MediaType.TEXT_HTML
Principais anotações JAX-RS Pequeno exemplo de Web Service REST 11
Principais anotações JAX-RS Extraindo Valores Anotação @PathParam @QueryParam @FormParam @MatrixParam @CookieParam @HeaderParam Descrição Especifica que o valor do parâmetro, será extraído do valor de um parâmetro indicado na URI, colocado na anotação @Path({param}) Extrai o valor do parâmetro da URI Ex:?idade=29&uf=RS Associa um parâmetro a um campo de formulário enviado pelo cliente Extrai informações do caminho de uma URI Ex: ;idade=29;uf=rs Extrai os valores de cookies vinculados à sessão Extrai dados do cabeçalho de uma requisição HTTP 12
Principais anotações JAX-RS Extraindo Valores 13
Principais anotações JAX-RS Algumas observações: 14 Uma mesma variável pode ser especificada múltiplas vezes em uma anotação @Path. Exemplo: @Path("/users/{nome}/{nome}") Neste caso, só serão aceitas requisições a URLs cujos dois últimos componentes sejam iguais Variáveis podem ser vazias. Exemplo: @Path("/users/{nome}/home") Cliente acessa URL /users//home A variável nome ganha o valor (String vazia) Note ainda que a anotação @Path pode ser usada para métodos específicos Aquele método será mapeado para aquela URL
Principais anotações JAX-RS Podemos ainda definir valores padrão com a anotação @DefaultValue Usados em caso de omissão 15
Principais anotações JAX-RS Há restrições em relação aos tipos dos parâmetros Só se pode usar tipos com as seguintes características: Tipos primitivos, exceto char Classes correspondentes a tipos primitivos, exceto Character Qualquer classe com construtor que recebe um único argumento do tipo String Qualquer classe com um método estático valueof(string) List<T>, Set<T>, SortedSet<T>, onde T cai em um dos casos anteriores. Caso não seja possível mapear o valor presente na URL para o tipo do parâmetro, é gerado um erro 400 Exemplo: parâmetro declarado como int, usuário especifica valor teste 16
Principais anotações - JAXB Java Architecture for XML Binding (JAXB) fornece a API, as ferramentas e um framework para mapear documentos (XML) e objetos Java Realiza o marshalling (serialização JAVA -> XML) e unmarshalling (deserialização XML -> JAVA) do conteúdo de documentos para representações Java As anotações estão presentes no pacote javax.xml.bind.annotation São utilizadas normalmente nos POJOs 17
Principais anotações - JAXB Classes 18 @XmlRootElement Indica que a classe será representada como um elemento XML principal Pode alterar o nome do elemento através do valor name= @XmlAccessorType(XmlAccessType.FIELD) Indica a localização das anotações, no caso estão nos campos do POJO @XmlType(propOrder = {"id", "nome", "email", "cpf", "endereco", "nascimento"}) Indica que a classe mapeia informações específicas Permite determinar, por exemplo, a order que os elementos serão exibidos
Principais anotações - JAXB Classes 19 @XmlEnum(String.class) Permite mapear uma classe enum com as devidas anotações em cada valor Atributos @XmlEnumValue( ACAO ) Mapeia um valor de um enum @XmlElementWrapper Mapeia um objeto do tipo lista (com tags filhas) @XmlElement(name = "contrato") Utilizada tanto nos atributos quanto nos métodos, indica que o atributo será um atributo XML
Principais anotações - JAXB Atributos @XmlAttribute(name= num_cpf ) Mapeia o valor de um campo como atributo no arquivo XML @XmlList Permite mapear atributos como listas dentro de uma única tag XML @XmlSchemaType(name = "date") Permite definir o mapeamento de diferentes tipos em Java @XmlTransient Permite definir que um atributo não será utilizado nas ações de serialização e deserialização de objetos 20
Entendendo o Web service A implementação do método OPTIONS é interessante Ela retorna (como esperado) o conjunto de requisições que são suportadas Mas também retorna um documento WADL 21
Entendendo o Web service WADL (Web Application Description Language)? O WADL é um formato de documento utilizado para descrever aplicações Web em geral Hoje, o exemplo mais comum de uso é com os RESTful Web Services Provê informação sobre as operações oferecidas Parâmetros esperados Formato da entrada Formato da resposta É o equivalente para RESTful Web Services do WSDL para Big Web Services 22
Entendendo o Web service Exemplo WADL 23
Configurar o ambiente Configuração de um RESTful web service ApplicationConfig.java 24
Configurar o ambiente Configuração de um RESTful web service ApplicationConfig.java Informar aqui o padrão de URL utilizada Adicionar cada classe dos serviços desenvolvidos 25
Configurar o ambiente Configuração de um RESTful web service Web.xml (precedência) 26
Configurar o ambiente Configuração de um RESTful web service Web.xml (precedência) Adicionar aqui o pacote que contenha os serviços desenvolvidos Informar aqui o padrão de URL utilizada 27
Exemplo de Web Services - REST Método GET 28
Exemplo de Web Services - REST Consumindo GET Construtor do cliente Consumo 29
Exemplo de Web Services - REST Consumindo GET Lista 30
Exemplo de Web Services - REST Método POST 31
Exemplo de Web Services - REST Consumindo POST 32
Exemplo de Web Services - REST Método PUT 33
Exemplo de Web Services - REST Consumindo PUT 34
Exemplo de Web Services - REST Método DELETE 35
Exemplo de Web Services - REST Consumindo DELETE 36
Exercício Fazer download do projeto WSRest Configurar o persistence.xml Criar a base de dados apropriada Observar os Web Services implementados Testar os Web Services mais simples (GET) diretamente no navegador Testar os Web Services através do cliente implementado dentro do projeto 37
Exercício Gerar um POJO para Transporte conforme a classe abaixo, persistindo no BD Gerar o DAO para cadastrar novos locais de entrega e o valor atrelado a estes, por peso Gerar os devidos serviços para as operações CRUD sobre essa entidade Criar um cliente para acessar os serviços desenvolvidos Transporte - estado: String - valor: Int - peso: Float 38
Perguntas?