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
Visão Geral
Import HTML Content
Conteúdo das Ferramentas
Tarefas