Labs SD >

Web Services Contract-First

Objetivos

Projeto:

 

Web Service contract

Os Web Services também têm uma linguagem própria para descrever o seu contrato com os clientes.
A WSDL permite especificar a interface funcional (port type) - operações com entradas, saídas e erros - e também a vinculação (binding) com tecnologias concretas - habitualmente SOAP sobre HTTP.
A WSDL é baseada em XML de forma a ser independente da plataforma e usa XSD para definir o detalhe dos tipos de dados de entrada e saída (e erros) em cada operação.

Um documento XML diz-se válido se, para além de ser bem-formado, respeita também as restrições impostas por um XSD.

Para uma explicação mais detalhada destas tecnologias, ver:

 


Exemplo

É possível implementar Web Services partindo de um contrato WSDL (e XSD) já existente. Esta abordagem ao desenvolvimento de serviços é chamada contract-first.

Vamos então ver um exemplo de um Web Service feito em Java que segue a abordagem contract-first.

Notas:
As pastas que contêm o código não devem ter espaços no seu caminho.
O servidor e o cliente usam a biblioteca UDDINaming apresentada na aula anterior.

 

  • Servidor JAX-WS
  • Cliente JAX-WS
  • Resumo

    Primeiro foi construído e iniciado o servidor, que fica à espera de pedidos no endpoint address e disponibiliza o WSDL original (e não um WSDL gerado automaticamente).

    Em seguida, foi necessário verificar que o cliente referencia o ficheiro WSDL e não o URL. Depois, o cliente usa o WSDL para gerar o código de invocação.
    Finalmente, o cliente faz uma invocação remota que pode receber o resultado esperado ou um erro simulado.

    Depois de testado o Exemplo, passar ao Exercício.

     


    Exercício

    Contract-first

    O objectivo desta primeira parte da aula é construir um Web Service contract-first, ou seja, gerar o código do servidor a partir do contrato WSDL e depois fazer a implementação em Java.

    1. Para começar, escolha o WSDL do serviço que pretende implementar. Sugestões:
    2. O ponto de partida é o exemplo Web Service contract-first apresentado acima, que deverá ser modificado.
      Para os serviços do projeto deverá ser usado o projeto base.
    3. Analise todos os ficheiros do projecto.
      1. Analisando o WSDL, que operações oferece o Web Service, quais os respectivos parâmetros e excepções?
      2. Em que fase do ciclo de vida de construção Maven é que o WSDL é usado para gerar código?
        Onde é colocado o código gerado pela ferramenta wsimport?
      3. Qual a classe que implementa o Web Service?
    4. Copie o ficheiro WSDL a implementar para a pasta src/main/resources
    5. Faça mvn generate-sources.
      Caso o WSDL esteja bem formado e válido, a ferramenta gera vários ficheiros que suportam o web service. Entre eles, estarão as classes para os tipos complexos usados como parâmetros e a interface Java que define o Web Service.
    6. Consulte as classes geradas, em especial a classe ...Service, e descubra a interface Java que foi gerada a partir do WSDL.
    7. Crie a classe de implementação do serviço ...Port, que deve implementar a interface Java gerada (PortType no WSDL). Em termos práticos, isto significa que todos os métodos listados na interface devem ser implementados na classe do serviço. Cada método é uma operação do Web Service, com entradas, saídas e excepções.
      Sugestão: para começar não implemente completamente as operações, limite-se a retornar imediatamente valores pré-definidos.
    8. Crie a classe ...Main com base na HelloMain.
    9. Edite o ficheiro pom.xml do projecto
      1. Altere os elementos mainclass, ws.name, ws.url, id
      2. Guarde as alterações
    10. Acrescentar a anotação @WebService com todos os atributos necessários (para descobrir os valores terá que consultar o código gerado e o WSDL, onde são definidos originalmente).
    11. 
      @WebService(
          endpointInterface="...",
          wsdlLocation="...",
          name="...",
          portName="...",
          targetNamespace="...",
          serviceName="..."
      )
      public class ...Port implements ...PortType {
      
          
    12. Faça mvn install para compilar o código e gerar o JAR.
      Nota: Os passos necessários para compilar, gerar o JAR, correr, etc. podem também ser encontrados readme.txt de cada projeto.
    13. Faça mvn exec:java para correr o servidor (o nome da classe e os argumentos foram definidos no pom.xml).
      O servidor deve executar sem erros.
      Para encerrar o servidor carregue em enter.
    14. Consulte o endereço do serviço publicado (deve começar com http://localhost:8080/...?WSDL). Confirme que o WSDL está a ser fornecido correctamente.
    15. O Web Service contract-first está pronto a receber pedidos.
      Um cliente de teste pode ser desenvolvido de forma idêntica aos já vistos na aula de laboratório anterior. Ou seja, a partir do WSDL, fazer mvn generate-sources, ver o código gerado e depois fazer as chamadas desejadas.

    Comparando a abordagem contract-first com a abordagem implementation-first, que vantagens e desvantagens encontra em cada uma?


    Extras

    Sugestão: Visualizar e validar um WSDL no Eclipse:


    Sugestão: WSDL Viewer


    © Docentes de Sistemas Distribuídos, Dep. Eng. Informática, Técnico Lisboa