Olá Devs.
Fiz um código simples para consumir o WebService em SOAP "consultaCEP" dos Correios usando a classe TWsdlManager. E curiosamente o Protheus "monta" um XML que o WS dos Correios não reconhece e retorna o erro: "SOAP Fault String: Couldn't parse stream."
Enfim, para contornar esse erro estou tentando utilizar o XML construído pelo SoapUI (que aliás funciona perfeitamente) através do método "SendSoapMsg", mas que infelizmente não funciona corretamente. Ao consultar a mensagem enviada ao WS através do método "GetSoapMsg" percebo que a mensagem enviada ao servidor foi a construída pela classe e não a atribuída pelo método "SendSoapMsg".
Alguém já passou por essa experiência e sabe como contornar?
Segue código:
#Include "Protheus.ch"
#Include "TopConn.ch"
/*/==============================================================================================/*/
/*/{Protheus.doc} UNWSCEP
Consulta CEP no WebService dos Correios.
@type function
@author Kley Gonçalves
@since 14/12/2021
@version P12.1.27
/*/
/*/==============================================================================================/*/
User Function UNWSCEP()
Local cURL as Char
Local oWsdl as Object
Local lRet as Logical
Local aOperat as Array
Local cMsgEnv as Char
Local cMsgResp as Char
Local cCodEmp := "AS"
Local cCodFil := "01"
Local cUsuario := "Administrador"
Local cSenhaP := ""
Local cModulo := "COM"
Local cFuncao := "U_UNWSCEP"
//--< Inicialização do ambiente >-------------------------------------------
RpcSetEnv( cCodEmp, cCodFil, cUsuario, cSenhaP, cModulo, cFuncao, /*aTables*/, , , , )
//--< Inicialização das variáveis >-----------------------------------------
cURL := SuperGetMV("MV_XWSCEP",.F.,"https://apps.correios.com.br/SigepMasterJPA/AtendeClienteService/AtendeCliente?wsdl")
lRet := .F.
aOperat := {}
cMsgEnv := ""
//--< Processamento da rotina >---------------------------------------------
oWsdl:= TWsdlManager():New()
oWsdl:nTimeout := 60
oWsdl:nSOAPVersion := 1
//oWsdl:cEncoding := "UTF-8"
oWsdl:lCompressed := .T.
oWsdl:lVerbose := .T.
oWsdl:lSSLInsecure := .T.
oWsdl:lCheckInput := .F.
If ( lRet := oWsdl:ParseURL(cURL) )
ConOut("CORREIOS: Conexão com Correios realizada com sucesso!")
Else
ConOut("CORREIOS: Erro no Parse do WS: " + oWsdl:cError )
EndIf
//If Len( aOperat := oWsdl:ListOperations() ) > 0
// ConOut( "CORREIOS: Lista de Operações carregada com sucesso!" )
//Else
// ConOut( "CORREIOS: Erro na lista de operações: " + oWsdl:cError )
//EndIf
If ( lRet := oWsdl:SetOperation("consultaCEP") )
ConOut( "CORREIOS: Operação selecionada com sucesso!" )
Else
ConOut( "CORREIOS: Erro na seleção da operação consultaCEP: " + oWsdl:cError )
EndIf
//aSimple := oWsdl:SimpleInput()
//varinfo( "", aSimple )
If ( lRet := oWsdl:SetValue(0, "08560040") )
ConOut( "CORREIOS: Valor atribuído com sucesso! :)" )
Else
//lRet := oWsdl:SetValue( aSimple[1][1], cUser )
ConOut( "CORREIOS: Erro nos parâmetros: " + oWsdl:cError )
EndIf
//--< Mensagem de Envio XML construído pelo SoapUI -- Funciona OK >--------------
cMsgEnv += "<?xml version='1.0' encoding='UTF-8' standalone='no' ?>"
cMsgEnv += '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:cli="http://cliente.bean.master.sigep.bsb.correios.com.br/">'
cMsgEnv += ' <soapenv:Header/>'
cMsgEnv += ' <soapenv:Body>'
cMsgEnv += ' <cli:consultaCEP>'
cMsgEnv += ' <!--Optional:-->'
cMsgEnv += ' <cep>08560040</cep>'
cMsgEnv += ' </cli:consultaCEP>'
cMsgEnv += ' </soapenv:Body>'
cMsgEnv += '</soapenv:Envelope>'
//--< Mensagem de Envio XML construído pelo Protheus, com ajustes -- Em Teste >--
//cMsgEnv += "<?xml version='1.0' encoding='UTF-8' standalone='no' ?>"
//cMsgEnv += '<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"'
//cMsgEnv += ' xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"'
//cMsgEnv += ' xmlns:xsd="http://www.w3.org/2001/XMLSchema"'
//cMsgEnv += ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"'
//cMsgEnv += ' xmlns:ns1="http://cliente.bean.master.sigep.bsb.correios.com.br/">'
//cMsgEnv += ' <SOAP-ENV:Body>'
//cMsgEnv += ' <consultaCEP xmlns="http://cliente.bean.master.sigep.bsb.correios.com.br/">'
////cMsgEnv += ' <cli:consultaCEP>'
//cMsgEnv += ' <!--Optional:-->'
//cMsgEnv += ' <cep>08560040</cep>'
//cMsgEnv += ' </consultaCEP>'
//cMsgEnv += ' </SOAP-ENV:Body>'
//cMsgEnv += '</SOAP-ENV:Envelope>'
//If ( lRet := oWsdl:SendSoapMsg() )
If ( lRet := oWsdl:SendSoapMsg(cMsgEnv) )
ConOut( "CORREIOS: Resposta do Servidor: " + (cMsgResp := oWsdl:GetSoapResponse()) )
Else
ConOut( "CORREIOS: Erro SendSoapMsg: " + oWsdl:cError )
ConOut( "CORREIOS: Erro SendSoapMsg FaultCode: " + oWsdl:cFaultCode )
ConOut( "CORREIOS: Resposta do Servidor: " + oWsdl:GetSoapResponse() )
EndIf
ConOut( "CORREIOS: Mensagem enviada ao servidor: " + oWsdl:GetSoapMsg() )
//--< Finalização do ambiente >---------------------------------------------
RpcClearEnv()
Return Nil