top of page

WSDL: Simplificando a integração de dados via Web Service(SOAP)

Neste artigo, veremos a importância que o documento WSDL tem em uma integração de dados entre duas organizações. Ele é um documento complexo e com muitas funcionalidades, que se bem utilizadas, podem facilitar muito a utilização e a reutilização de Web Services. Certamente vale se aprofundar no assunto.

WSDL, que significa Web Services Description Language, é um padrão de mercado para descrever Web Services de forma a eliminar ao máximo a necessidade de comunicação entre as partes envolvidas em uma integração de dados. Ele normalmente é encontrado quando acrescentarmos “?wsdl” ao final da URL onde o Web Service está hospedado.

Observe a Listagem 1 onde temos um WSDL como exemplo.

Listagem 1. Exemplo de um arquivo WSDL.

<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
   xmlns:tns="http://www.mayconoliveira.org/webservices/"   
   xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
   xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="webservices"
   targetNamespace="http://www.mayconoliveira.org/webservices/">
   <wsdl:documentation>Prezado fornecedor, este é um Web Service de
    exemplo, voltado a inclusao de clientes.
   </wsdl:documentation>

   <wsdl:types>
    <xsd:schema targetNamespace="http://www.mayconoliveira.org/webservices/">
     <xsd:element name="ClienteRequest">
      <xsd:complexType>
       <xsd:sequence>
        <xsd:element name="nome" type="xsd:string">
         <xsd:annotation>
          <xsd:documentation>
           Aqui você deve enviar o nome do cliente
           exatamente como consta em seu RG
          </xsd:documentation>

         </xsd:annotation>
        </xsd:element>
        <xsd:element name="idade" type="xsd:int" minOccurs="0">
         <xsd:annotation>
          <xsd:documentation>
           Informe a idade do cliente a ser utilizado no
           email marketing.
          </xsd:documentation>

         </xsd:annotation>
        </xsd:element>
       </xsd:sequence>
      </xsd:complexType>
     </xsd:element>
     <xsd:element name="ClienteResponse">
      <xsd:complexType>
       <xsd:sequence>
        <xsd:element name="mensagem" type="xsd:string">
         <xsd:annotation>
          <xsd:documentation>
           Mensagem devolvida do Web Service.
          </xsd:documentation>

         </xsd:annotation>
        </xsd:element>
        <xsd:element name="numeroRecibo" type="xsd:int" minOccurs="0">
         <xsd:annotation>
          <xsd:documentation>
           Recibo da inclusão. Somente é devolvido em
           caso de sucesso.
          </xsd:documentation>

         </xsd:annotation>
        </xsd:element>
       </xsd:sequence>
      </xsd:complexType>
     </xsd:element>
    </xsd:schema>
   </wsdl:types>
   <wsdl:message name="ClienteRequest">
    <wsdl:part element="tns:ClienteRequest" name="parameters" />
   </wsdl:message>
   <wsdl:message name="ClienteResponse">
    <wsdl:part element="tns:ClienteResponse" name="parameters" />
   </wsdl:message>
   <wsdl:portType name="webservicesPortType">
    <wsdl:operation name="incluirCliente">
     <wsdl:input message="tns:ClienteRequest" />
     <wsdl:output message="tns:ClienteResponse" />
    </wsdl:operation>
   </wsdl:portType>
   <wsdl:binding name="webservicesSOAP" type="tns:webservicesPortType">
    <soap:binding style="document"
     transport="http://schemas.xmlsoap.org/soap/http" />
    <wsdl:operation name="incluirCliente">
     <soap:operation soapAction=
       "http://www.mayconoliveira.org/webservices/incluirCliente" />
     <wsdl:input>
      <soap:body use="literal" />
     </wsdl:input>
     <wsdl:output>
      <soap:body use="literal" />
     </wsdl:output>
    </wsdl:operation>
   </wsdl:binding>
   <wsdl:service name="webservices">
    <wsdl:port binding="tns:webservicesSOAP" name="webservicesSOAP">
     <soap:address location="http://www.mayconoliveira.org/meuwebserviceaqui" />
    </wsdl:port>
   </wsdl:service>
  </wsdl:definitions>

O WSDL da Listagem 1 é um descritor de um WebService simples que recebe o nome e a idade de um cliente e retorna um número de recibo em caso de sucesso. Mas essa explicação já foi possível de extrair ao ler o documento, correto? A tag documentation nos possibilita a inclusão da nossa documentação, dispensando um documento auxiliar como um pdf para explicar os objetivos do Web Service ou para que serve cada campo. Isso não só garante que a informação fique centralizada, como também facilita a leitura por terceiros.

Também podemos extrair deste WSDL a informação que a idade do cliente a ser enviada pelo invocador do serviço e o número do recibo devolvido pelo servidor são opcionais, ou seja, podem não ser informados. Isso pode ser verificado através do atributo minOccurs com o valor 0 (O default, caso não informado, é 1, ou seja, obrigatório). Sabemos também que idade é tipo “int” (inteiro) e o nome é do tipo string. Para maiores informações sobre todos os tipos de dados, verifique a documentação oficial em http://www.w3.org/TR/xmlschema-2/#datatype.

Existem outras informações que podemos verificar, tais como o endereço real a qual o Web Service está hospedado (tag address), valores que temos que informar no Header da requisição HTTP, tais como a SOAPAction disponível na tag soapAction, entre outras. Todas elas juntas servem para gerar uma requisição HTTP válida ao servidor destino, como na Listagem 2.

Listagem 2. Requisição http gerada a partir do WSDL da Listagem 1

POST http://www.mayconoliveira.org/ HTTP/1.1
  Content-Type: text/xml;charset=UTF-8
  SOAPAction: "http://www.mayconoliveira.org/webservices/incluirCliente"
  Content-Length: 332
  Host: www.mayconoliveira.org
  Connection: Keep-Alive
   
  <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:web="http://www.maycon.org/webservices/">
     <soapenv:Header/>
     <soapenv:Body>
        <web:ClienteRequest>
           <nome>Maycon Fabio de Oliveira</nome>
           <idade>27</idade>
        </web:ClienteRequest>
     </soapenv:Body>
  </soapenv:Envelope>

Nessa conjuntura a única pergunta que precisamos fazer a outra parte a ser integrada é: "Qual a URL do seu WSDL?"

Apesar das vantagens no uso do WSDL, o mesmo é complexo, característica que desencoraja muitas vezes o seu uso. Ao invês disso o mais usado é se escrever o webService em linguagem de programação e o mesmo gera o documento WDSL(abordagem bottom-up). Isso pode acarretar problemas em uma migração de tecnologia, pois cada linguagem de programação pode gerar um WSDL diferente.

Outro argumento seria que os webServices baseados em SOAP estão ultrapassados com o surgimento do REST, porem ainda temos serviços baseados em SOAP que como desenvolvedores em algum momento teremos que lidar com eles, como Nota Fiscal Eletrônica, TISS(troca de informação na Saúde Suplementar da ANS).

bottom of page