1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

  2. Anuncie Aqui ! Entre em contato fdantas@4each.com.br

Webservice - [Resolvido] Erro no retorno da validação XML

Discussão em 'Outros/Diversos' iniciado por tharces, Fevereiro 26, 2014.

  1. tharces

    tharces Sem Pontuação

    Olá, senhores.

    Estou gerando um arquivo xml que deve ser validado pelo webservice. Via soapUI, o xml valida com sucesso, mas no programa, a procedure IncluirSM retorna um erro estranho...

    Erro: "!ISO8859-1!<viagem_result xmlns:ns1="http://tstportal.buonny.com.br/portal/wsdl/buonny" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><codigo_sm></codigo_sm><erro>Veiculo principal n&#xe3;o informado&#x0a;O token informado n&#xe3;o confere com o cnpj do cliente</erro></viagem_result>".

    Montei o programa de acordo com a documentação do webservice do cliente (usei o bprowsdldoc), e desconfio que o problema do retorno tenha sua causa no encoding (SESSION:CPINTERNAL = "ISO8859-1"), que pode ser, também, o responsável por bagunçar os acentos na msg de retorno.

    O esquisito é que independentemente do hSAXWriter:ENCODING ser "ISO8859-1" ou "UTF-8", ou mesmo "?", no soapuUI valida com sucesso o arquivo xml gerado pelo programa, mas a validação via procedure de retorno (IncluirSM) continua retornando o erro que mencionei dois parágrafos acima.

    Se alguém da comunidade puder me ajudar, ficarei muito agradecido.

    Segue o fonte:

    Código:
    CREATE SAX-WRITER hSAXWriter.
    
            hSAXWriter:STRICT      = true.
            hSAXWriter:FORMATTED    = true.
            /*hSAXWriter:ENCODING    = "UTF-8" /*"ISO-8859-1"*/.*/
               
            lok = hSAXWriter:set-output-destination("file", c-local).
                                               
            lok = hSAXWriter:start-document().
            lok = hSAXWriter:start-element("soapenv:Envelope").
    
            lok = hSAXWriter:INSERT-attribute("xmlns:soapenv","http://schemas.xmlsoap.org/soap/envelope/").
            lok = hSAXWriter:INSERT-attribute("xmlns","http://tstportal.buonny.com.br/portal/wsdl/buonny").
    
            lok = hSAXWriter:start-element("soapenv:Header").
            lok = hSAXWriter:end-element("soapenv:Header").
    
            lok = hSAXWriter:start-element("soapenv:Body").
            lok = hSAXWriter:start-element("viagem").
            lok = hSAXWriter:start-element("autenticacao").
                lok = hSAXWriter:write-data-element("token" , "4c0631b9d459c5ea71508a699abd780f").
            lok = hSAXWriter:end-element("autenticacao").
    
            lok = hSAXWriter:write-data-element("cnpj_cliente" , if avail b-ende_pj then string(b-ende_pj.cgc) else "").
            lok = hSAXWriter:write-data-element("cnpj_embarcador" , if avail b-ende_pj then string(b-ende_pj.cgc) else "").
            lok = hSAXWriter:write-data-element("cnpj_transportador" , if avail b-ende_pj then string(b-ende_pj.cgc) else "").
            lok = hSAXWriter:write-data-element("pedido_cliente" , string(ordm_cgto.nro_ordm_cgto)).
        
            run pi-dados-conh.
    
            lok = hSAXWriter:end-element("itinerario").
    
            lok = hSAXWriter:start-element("iscas").
            lok = hSAXWriter:end-element("iscas").
    
            lok = hSAXWriter:start-element("escolta").
            lok = hSAXWriter:end-element("escolta").   
    
            lok = hSAXWriter:end-element("viagem").
            lok = hSAXWriter:end-element("soapenv:Body").
            lok = hSAXWriter:end-element("soapenv:Envelope").
    
            lok = hSAXWriter:end-DOCUMENT().
    
        end.
    
        DELETE OBJECT hSAXWriter no-error.
    
        CREATE SERVER hWebService.
    
        hWebService:CONNECT("-WSDL 'http://tstportal.buonny.com.br/portal/wsdl/buonny.wsdl' -Port IncluirSm").
    
        RUN IncluirSmPort SET hIncluirSmPort ON hWebService.
    
        COPY-LOB FROM FILE c-local TO c-msg-xml no-convert.
    
        MESSAGE string(c-msg-xml)
            VIEW-AS ALERT-BOX INFO BUTTONS OK.
    
       /*é aqui que o erro acontece, no retorno (responseViagemResult)*/
        RUN incluirSm IN hIncluirSmPort(INPUT c-msg-xml, OUTPUT responseViagemResult).
                                         
        output to c:/temp/msg-xml.txt no-convert.
            export c-msg-xml.
        output close.
    
        OUTPUT TO "c:\temp\result-xml.xml" no-convert.
            EXPORT responseViagemResult.
        OUTPUT CLOSE.
    
        hWebService:DISCONNECT().
        DELETE OBJECT hWebService.
    
    PROCEDURE incluirSm:
    
        DEFINE INPUT  PARAMETER requestViagem AS longchar NO-UNDO.
        DEFINE OUTPUT PARAMETER responseViagemResult AS longchar NO-UNDO.
    
    end procedure.
    Que tenhamos uma semana de utilidade, bondade e paz.

    At.te.,
    Tharces
    Última edição: Fevereiro 26, 2014
  2. Agnaldo

    Agnaldo Membro Ativo

    Acho que isso não é um erro.
    Esta sendo mostrado o XML que retornou.
    Porém, como ele esta numa variável longchar, ele mostra o prefixo do code page em uso.
  3. tharces

    tharces Sem Pontuação

    Obrigado pela resposta, Agnaldo. Mas é estranho, porque deveria retornar o resultado da validação... Você tem idéia de como resolvo isso?
  4. Agnaldo

    Agnaldo Membro Ativo

    Faz um teste copiando o campo longchar para um memptr, por exemplo.
    Depois faça export dele, igual voce fez com o longchar.
  5. tharces

    tharces Sem Pontuação

    Posso copiar o resultado (responseViagemResult) para uma variável memptr (COPY-LOB responseViagemResult to c-msg-memptr), mas o problema continua no resultado que a procedure "incluirSM" apresenta. O retorno dela é: "veículo principal não informado e token informado não confere", o que não condiz com o retorno do mesmo arquivo xml pelo soapUI, que valida com sucesso.

    PROCEDURE incluirSm:

    DEFINE INPUT PARAMETER requestViagem AS longchar NO-UNDO.
    DEFINE OUTPUT PARAMETER responseViagemResult AS longchar NO-UNDO.

    end procedure.

    Conteúdo do retorno da "responseViagemResult":

    "!ISO8859-1!<viagem_result xmlns:ns1="http://tstportal.buonny.com.br/portal/wsdl/buonny" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><codigo_sm></codigo_sm><erro>Veiculo principal n&#xe3;o informado&#x0a;O token informado n&#xe3;o confere com o cnpj do cliente</erro></viagem_result>".
  6. Agnaldo

    Agnaldo Membro Ativo

    Ah tá, entendi.
    Voce esta enviando em requestViagem aquele xml gerado pelo sax. E provavelmente voce esta usando aquele formato, com envelope, header, body, etc, pois viu eles no teste do soapUI.
    Mas se voce olhar a documentação gerada pelo Progress (bprowsdldoc) vai ver que o xml dele não usa essa parte.
    Ou seja, já começa na tag "viagem"
    Código:
    <ns0:viagem xmlns:ns0="http://tstportal.buonny.com.br/portal/wsdl/buonny">
         <ns0:autenticacao>
              <ns0:token>string-value</ns0:token>
         </ns0:autenticacao>
         <ns0:sistema_origem>string-value</ns0:sistema_origem>
        .
        .
        .
    
    Limpando um pouco
    Código:
    <viagem>
         <autenticacao>
              <token>string-value</token>
         </autenticacao>
         <sistema_origem>string-value</sistema_origem>
        .
        .
        .
    
    Que dizer, voce deve enviar no parametro requestViagem apenas o xml com os dados, que começa na tag viagem.
    Última edição: Fevereiro 26, 2014

Compartilhe esta Página