terça-feira, 4 de agosto de 2015

Codificando XML para importação WSDL na criação de webservice pelo Enterprise service (SE80)

  Tive muito problema para fazer funcionar o webservice de uma SEFAZ, o wsdl fornecido na importação no SAP ficava muito vago, para isso eu tive q trabalhar o arquivo manualmente para criação das estruturas.
 Vou deixar descrito algumas linhas de código essenciais para criação da estrutura.

Dentro do WSDL deve ser considerado algumas variáveis internas utilizado ao longo da construção da estrutura.

São alias para o endereço de chamda principal. como abaixo
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
xmlns:tns="http://www.sefaz.es.gov.br/duae"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:s="http://www.w3.org/2001/XMLSchema"
xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"
xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
targetNamespace="http://www.sefaz.es.gov.br/duae"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">


ao longo da estrutura são utilizados algo como "S:", "TNS:"... que são referências a declaração acima. 

-Criação de elemento simples.
<s:element name="raiz">





   <s:complexType>
       <s:sequence>
         
<s:element name="campo1" maxOccurs="0" minOccurs="1" type="s:string"/> 
       </s:sequence>           
   </s:complexType>           

</s:element>

Na importação do WSDL no SAP seria criado uma estrutura na SE11
nome Raiz com um campo chamado CAMPO1

=====================================================

-Criação de elemento com estrutura.

<s:complextype name="estrutura1">
  <s:sequence>
          <s:element name="campo2" minOccurs="1" type="s:string"/>
      <s:element name="campo3" minOccurs="1" type="s:string"/>
      <s:element name="campo4" minOccurs="1" type="s:string"/>  
  </s:sequence>
</s:complextype>






<s:element name="raiz">

   <s:complexType>
       <s:sequence>
         
<s:element name="campo1" maxOccurs="0" minOccurs="1" type="tns:estrutura1"/> 
       </s:sequence>           
   </s:complexType>           

</s:element>


Nesse caso na importação do wsdl no sap ficaria com uma estrutura chamada RAIZ com um campo CAMPO1 do tipo da estrutura ESTRUTURA1 que seria criado com os campos, CAMPO2, CAMPO3, CAMPO4 todas do tipo string.

=====================================================
-Criação de elemento tipo tabela.

<s:complextype name="tab1">
  <s:sequence>
          <s:element name="campo2" minOccurs="1" type="s:string"/>
      <s:element name="campo3" minOccurs="1" type="s:string"/>
      <s:element name="campo4" minOccurs="1" type="s:string"/>  
  </s:sequence>
</s:complextype>



<s:element name="raiz">

   <s:complexType>
       <s:sequence>
         
<s:element name="campo1" maxOccurs="unbounded" minOccurs="1" type="tns:tab1"/> 
       </s:sequence>           
   </s:complexType>           

</s:element>


Nesse caso na importação do wsdl no sap ficaria com uma estrutura chamada RAIZ com um campo CAMPO1 do tipo tabela TAB1 que seria criado com os campos, CAMPO2, CAMPO3, CAMPO4 todas do tipo string.

============================================================
-Criação de elemento com atributo.


<s:complextype name="estrutura1">
  <s:sequence>
          <s:element name="campo2" minOccurs="1" type="s:string"/>
      <s:element name="campo3" minOccurs="1" type="s:string"/>
      <s:element name="campo4" minOccurs="1" type="s:string"/>  
  </s:sequence>
  <s:attribute name="versao" type="string" use="required"/>
</s:complextype>



<s:element name="raiz">

   <s:complexType>
       <s:sequence>
         
<s:element name="campo1" maxOccurs="0" minOccurs="1" type="tns:estrutura1"/> 
       </s:sequence>           
   </s:complexType>           

</s:element>

Utilizei o caso de um campo do tipo estrutura. No caso acima seria como se dentro do XML ficasse dessa forma.

<raiz>
  <campo1 versao="xxxx">
    <campo2> </campo2>
    <campo3> </campo3>
    <campo4> </campo4>

  </campo1>
</raiz>


No caso do atributo no parâmetro de entrada do proxy deve ser declarado com o uso obrigatório, senão não aparece no XML.

=================================================

No caso do XML tive o comando CHOICE muito solicitado no caso de enviar ou CPF ou CNPJ.

Declarar os 2 campos como elemento, somente o preenchido irá para o XML, a tag do outro  nem aparece.

===================================================

Eu tive um caso da tag do retorno ser diferente no caso de um retorno com sucesso ou de erro, funciona da mesma forma acima, deve-se declarar as 2 tags cada um com sua estrutura, no momento do retorno o SAP verifica em qual das tags irá ser preenchido as informações

=====================================================

Transação útil para verificação do Webservice.  SRT_UTIL, faz o rastreamento da saída e retorno do SAP bem como o xml enviado e o de retorno.



Nenhum comentário:

Postar um comentário