Versão atual:

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

Versão (1):

Ver a versão formatada

TWsdlManager ConsultaCEP Correios

Comentário

new question