Árvore de páginas

Um documento WSDL, que descreve um Web Service, pode indicar que o WS aceita mensagens usando os padrões SOAP 1.1 e SOAP 1.2.

SOAP 1.1 e SOAP 1.2 possuem algumas diferenças:

  • SOAP 1.1 foi desenvolvido por e é propriedade de 5 empresas (Microsoft, IBM, Lotus, Developmentor, and UserLand). SOAP 1.2 está sendo desenvolvido pelo World Wide Web Consortium (W3C), com contribuições de mais de 50 empresas, e será licenciada livre de royalties.
  • SOAP 1.1 está baseada em XML 1.0. SOAP 1.2 está baseada no Conjunto de Informações XML (XML Infoset).
  • A especificação de SOAP 1.1 é definida em um documento. A especificação de SOAP 1.2 é definida em 3 documentos (um documento básico, o framework básico de tratamento de mensagens, e os complementos (convenção de RPC, SOAP encoding, padrões de troca de mensagens, etc.))
  • SOAP 1.2 coloca "application/soap+xml" no header HTTP Content-Type e SOAP 1.1 coloca "text/xml".
  • SOAPAction é obrigatório para SOAP 1.1 and opcional para SOAP 1.2.
  • SOAP 1.2 usa o endereço de namespace "http://www.w3.org/2003/05/soap-envelope/" para o Envelope SOAP e SOAP 1.1 usa "http://schemas.xmlsoap.org/soap/envelope/".

A classe AdvPL TWsdlManager dá suporte a SOAP 1.1 e SOAP 1.2. Caso o WS informe que aceita ambos os padrões, a classe irá utilizar SOAP 1.2.

Nesse caso, se for enviada uma mensagem personalizada, através do método SendSoapMsg, deve-se ter o cuidado com o namespace utilizado para as tags do envelope SOAP.

Exemplo de uso da TWsdlManager
user function wsdl2()
  Local lRet    := Nil
  Local cMsg    := ""
  Local oWsdl   := Nil
  Local cMsgRet := ""
  
  oWsdl := TWsdlManager():New()
  oWsdl:cSSLCACertFile := "\certs\sefazca.pem"
  oWsdl:cSSLCertFile   := "\certs\sefazcert.pem"
  oWsdl:cSSLKeyFile    := "\certs\sefazkey.pem"
  oWsdl:cSSLKeyPwd     := "password"
  oWsdl:nSSLVersion    := 1
  oWsdl:nTimeout       := 120
  
  xRet := oWsdl:ParseURL("https://www.nfe.fazenda.gov.br/NfeDownloadNF/NfeDownloadNF.asmx?wsdl")
  if xRet == .F.
    conout("Erro ParseURL: " + oWsdl:cError)
    Return
  endif
  
  // Define a operação
  lRet := oWsdl:SetOperation("nfeDownloadNF")
  If lRet == .F.
    conout("Erro SetOperation: " + oWsdl:cError)
    return
  EndIf
  
  // Mensagem enviada com namespace de SOAP 1.1, que dará erro, pois, como o WSD possui SOAP 1.1 e 1.2, a classe utilizará SOAP 1.2
  // cMsg := '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:nfed="http://www.portalfiscal.inf.br/nfe/wsdl/NfeDownloadNF">' + CRLF
  // cMsg += '    <soapenv:Header>' + CRLF
  // cMsg += '       <nfed:nfeCabecMsg>' + CRLF
  // cMsg += '          <nfed:versaoDados>1.00</nfed:versaoDados>' + CRLF
  // cMsg += '          <nfed:cUF>31</nfed:cUF>' + CRLF
  // cMsg += '       </nfed:nfeCabecMsg>' + CRLF
  // cMsg += '    </soapenv:Header>' + CRLF
  // cMsg += '    <soapenv:Body>' + CRLF
  // cMsg += '       <nfed:nfeDadosMsg>' + CRLF
  // cMsg += '          <downloadNFe versao="1.00" xmlns="http://www.portalfiscal.inf.br/nfe"><tpAmb>1</tpAmb><xServ>DOWNLOAD NFE</xServ><CNPJ>86501400000104</CNPJ><chNFe>31150502806413000274550010000074971000042278</chNFe></downloadNFe>' + CRLF
  // cMsg += '       </nfed:nfeDadosMsg>' + CRLF
  // cMsg += '    </soapenv:Body>' + CRLF
  // cMsg += '</soapenv:Envelope>'
  
  // Mesma mensagem que a anterior, mas com namespace de SOAP 1.2
  cMsg := '<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope" xmlns:nfed="http://www.portalfiscal.inf.br/nfe/wsdl/NfeDownloadNF">' + CRLF
  cMsg += '   <soapenv:Header>' + CRLF
  cMsg += '      <nfed:nfeCabecMsg>' + CRLF
  cMsg += '          <nfed:versaoDados>1.00</nfed:versaoDados>' + CRLF
  cMsg += '          <nfed:cUF>31</nfed:cUF>' + CRLF
  cMsg += '       </nfed:nfeCabecMsg>' + CRLF
  cMsg += '    </soapenv:Header>' + CRLF
  cMsg += '    <soapenv:Body>' + CRLF
  cMsg += '       <nfed:nfeDadosMsg>' + CRLF
  cMsg += '          <downloadNFe versao="1.00" xmlns="http://www.portalfiscal.inf.br/nfe"><tpAmb>1</tpAmb><xServ>DOWNLOAD NFE</xServ><CNPJ>86501400000104</CNPJ><chNFe>31150502806413000274550010000074971000042278</chNFe></downloadNFe>' + CRLF
  cMsg += '       </nfed:nfeDadosMsg>' + CRLF
  cMsg += '    </soapenv:Body>' + CRLF
  cMsg += '</soapenv:Envelope>'
  
  // Envia uma mensagem SOAP personalizada ao servidor
  lRet := oWsdl:SendSoapMsg( cMsg )
  If lRet == .F.
    conout( "Erro SendSoapMsg: " + oWsdl:cError )
    conout( "Erro SendSoapMsg FaultCode: " + oWsdl:cFaultCode )
    Return
  EndIf
  
  cMsgRet := oWsdl:GetSoapResponse()
  conout( cMsgRet )
  
return



  • Sem rótulos