TWsdlManager ConsultaCEP Correios

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
compartilhar
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do TOTVS DevForum!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags twsdlmanager getsoapmsg sendsoapmsg ou faça a sua própria pergunta.