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

Urgente Web Service com Request-Header - Passar ID e Token

Discussão em 'Progress 4GL' iniciado por TrombiniSP, Setembro 14, 2015.

  1. TrombiniSP

    TrombiniSP Membro Participativo

    Olá,

    Estou consumindo um WS que necessita da passagem de IdUsuario e o Token obtido no método Autenticar.

    Eu autentico sem problemas e guardo do Token para passar para o próximo método.

    No meu o método é Pesquisar. Eu tentei chamá-lo normalmente usando os parâmetros gerados pelo WSDL Analyzer.

    Segue:
    Código:
    DEFINE VARIABLE hWebService AS HANDLE NO-UNDO.
    DEFINE VARIABLE hWebServiceRobosSoap AS HANDLE NO-UNDO.
    
    CREATE SERVER hWebService.
    
    hWebService:CONNECT("-WSDL 'http://<domain>/<servico>.asmx?WSDL'").
    
    RUN WebServiceRobosSoap SET hWebServiceRobosSoap ON hWebService.
    
    DEFINE VARIABLE grupoServico    AS CHARACTER NO-UNDO.
    DEFINE VARIABLE servico         AS CHARACTER NO-UNDO.
    DEFINE VARIABLE tipoPesquisa    AS CHARACTER NO-UNDO.
    DEFINE VARIABLE colecaoDeChaves AS LONGCHAR NO-UNDO.
    DEFINE VARIABLE PesquisarResult AS LONGCHAR NO-UNDO.
    
    ASSIGN grupoServico = "Consulta"
           servico      = "ConsultaSimples"
           tipoPesquisa = "PessoaJuridica".
    
    ASSIGN colecaoDeChaves = colecaoDeChaves + "<ns0:colecaoDeChaves xmlns:ns0='http://www.audiconsearch.com.br/webservice'>" + CHR(13)
           colecaoDeChaves = colecaoDeChaves + "<ns0:Chaves>" + CHR(13)
           colecaoDeChaves = colecaoDeChaves +  "<ns0:chave>" + CHR(13)
           colecaoDeChaves = colecaoDeChaves +    "<ns0:nome>cnpj</ns0:nome>" + CHR(13)
           colecaoDeChaves = colecaoDeChaves +    "<ns0:valor>12345678901234</ns0:valor>" + CHR(13)
           colecaoDeChaves = colecaoDeChaves +  "</ns0:chave>" + CHR(13)
           colecaoDeChaves = colecaoDeChaves + "</ns0:Chaves>" + CHR(13)
           colecaoDeChaves = colecaoDeChaves + "</ns0:colecaoDeChaves>".
    
    RUN Pesquisar IN hWebServiceRobosSoap(INPUT grupoServico,
                                          INPUT servico,
                                          INPUT tipoPesquisa,
                                          INPUT colecaoDeChaves,
                                          OUTPUT PesquisarResult).
    
    MESSAGE STRING(PesquisarResult)
        VIEW-AS ALERT-BOX INFO BUTTONS OK.
    
    PROCEDURE Pesquisar:
        DEFINE INPUT  PARAMETER grupoServico    AS CHARACTER   NO-UNDO.
        DEFINE INPUT  PARAMETER servico         AS CHARACTER   NO-UNDO.
        DEFINE INPUT  PARAMETER tipoPesquisa    AS CHARACTER   NO-UNDO.
        DEFINE INPUT  PARAMETER colecaoDeChaves AS LONGCHAR    NO-UNDO.
        DEFINE OUTPUT PARAMETER PesquisarResult AS LONGCHAR    NO-UNDO.
    END PROCEDURE.
    
    Na mensagem do retorno tem uma TAG <Controle> e ela informa "Token Expirado". Até aqui está certo porque não passei o Token.

    Eu devo incluir a chamada ao método de Autenticação e passar o Usuário e o Token.

    E é aqui que entra o problema.

    Estes dados tem que ser passados pelo SOAP Header da chamada usando uma procedure que monta o Header e depois adicionando SET-CALLBACK-PROCEDURE do tipo:

    Código:
    SET-CALLBACK-PROCEDURE("REQUEST-HEADER", "ReqHandler").
    
    Na documentação do WSDL Analyzer ele me informa o tipo de dado esperado no Request-Header, como segue:

    Código:
    <ns0:TokendeAutenticacao xmlns:ns0="http://www.audiconsearch.com.br/webservice">
      <ns0:IdUsuario>long-value</ns0:IdUsuario>
      <ns0:InnerToken>string-value</ns0:InnerToken>
    </ns0:TokendeAutenticacao>
    Já na documentação do WS (que é em .Net e gera os cabeçalhos SOAP) está assim:

    Código:
    POST /WebServiceRobos.asmx HTTP/1.1
    Host: <domain>
    Content-Type: text/xml; charset=utf-8
    Content-Length: length
    SOAPAction: "http://<domain>/webservice/Pesquisar"
    
    <?xml version="1.0" encoding="utf-8"?>
    <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
      <soap:Header>
        <TokendeAutenticacao xmlns="http://<domain>/webservice">
          <IdUsuario>long</IdUsuario>
          <InnerToken>guid</InnerToken>
        </TokendeAutenticacao>
      </soap:Header>
      <soap:Body>
        <Pesquisar xmlns="http://<domain>/webservice">
          <grupoServico>string</grupoServico>
          <servico>string</servico>
          <tipoPesquisa>string</tipoPesquisa>
          <colecaoDeChaves>
            <Chaves>
              <chave>
                <nome>string</nome>
                <valor>string</valor>
              </chave>
              <chave>
                <nome>string</nome>
                <valor>string</valor>
              </chave>
            </Chaves>
          </colecaoDeChaves>
        </Pesquisar>
      </soap:Body>
    </soap:Envelope>
    
    

    Eu usei uma procedure seguindo os exemplos da Progress. Tanto os que estão na documentação quanto aos do presentes no http://knowledgebase.progress.com/

    Ficou assim:
    Código:
    PROCEDURE BuildRequestHeader: 
      /* Define procedure parameter */
      DEFINE OUTPUT PARAMETER hHeader AS HANDLE.
      DEFINE VARIABLE hHeaderEntryref AS HANDLE.
      DEFINE VARIABLE ClientNS AS CHARACTER 
        INIT "http://ServiceHost/SOAPHeader".
    
      /* Create SOAP header and server objects */
      CREATE SOAP-HEADER hHeader.
      CREATE SOAP-HEADER-ENTRYREF hHeaderEntryref.
      /* Create x-doc objects to build header */
      CREATE X-DOCUMENT hXdoc.
      CREATE X-NODEREF hXAttribute.
      CREATE X-NODEREF hXnoderef0.
      CREATE X-NODEREF hXnoderef1.
      CREATE X-NODEREF hXnoderef2.
      CREATE X-NODEREF hXtext.
       
      hHeader:ADD-HEADER-ENTRY(hHeaderEntryref).
    
      hXdoc:CREATE-NODE-NAMESPACE(hXnoderef1, ClientNS, "TokenAutenticacao", "ELEMENT").
      hXdoc:APPEND-CHILD(hXnoderef1).
      hXnoderef1:SET-ATTRIBUTE("xmlns", "http://<domain>/webservice").
      hXdoc:CREATE-NODE-NAMESPACE(hXnoderef2, ClientNS, "IdUsuario", "ELEMENT").
      hXnoderef1:APPEND-CHILD(hXnoderef2).
      hXdoc:CREATE-NODE(hXtext,"","text").
      hXnoderef2:APPEND-CHILD(hXtext).
      hXtext:NODE-VALUE = cUsername.
      /*8*/ 
    
     hXdoc:CREATE-NODE-NAMESPACE(hXnoderef2, ClientNS, "InnerToken", "ELEMENT").
      hXnoderef1:APPEND-CHILD(hXnoderef2).
      hXdoc:CREATE-NODE(hXtext, "", "text").
      hXnoderef2:APPEND-CHILD(hXtext).
     hXtext:NODE-VALUE = cToken.
      /*9*/ 
      /* Fill the header entry using a deep copy */
     hHeaderEntryref:SET-NODE(hXnoderef1).
      /*9*/ 
      /* Fill the header entry using a deep copy */
     hHeaderEntryref:SET-NODE(hXnoderef1).
      /*10*/ 
    
      /* Procedure/header cleanup */ 
     DELETE OBJECT hXdoc.
     DELETE OBJECT hXAttribute.
     DELETE OBJECT hXnoderef1.
     DELETE OBJECT hXnoderef2.
     DELETE OBJECT hXtext.
     DELETE OBJECT hHeaderEntryref.
    END PROCEDURE.
    
    PROCEDURE ReqHandler: /*1*/ 
      /* Define procedure parameters */
      DEFINE OUTPUT PARAMETER hHeader       AS HANDLE.
      DEFINE INPUT  PARAMETER cNamespace    AS CHARACTER.
      DEFINE INPUT  PARAMETER cLocalNS      AS CHARACTER.
      DEFINE OUTPUT PARAMETER lDeleteOnDone AS LOGICAL.
      /*2*/ 
      /* Pass in global header reused for every request */
      hHeader = g_header.
      lDeleteOnDone = FALSE.
    END PROCEDURE.
    

    Depois de tudo isso ele me retorna erro 11773 "Error receiving Web Service Response: Bad Request. Status code 400 received. (11773)".

    Pesquisei tudo no KBASE, nos fontes do OpenEdge e no StackOverFlow. Até agora nada, e já estou super atrasado devido a problemas de saúde.

    Já não faço mais ideia do que fazer. Usei o .Net com C# e o SOAPUI para testar o método e consegqui, mas no progress este método com parametros no Header está matando.

    Quem puder ajudar, agradeço.

    Obrigado.
  2. Eilleen

    Eilleen Membro Ativo

    Já tentou gerar a documentação do WSDL com o bprowsdldoc?
  3. Eilleen

    Eilleen Membro Ativo

    o comando é:
    bprowsdldoc <caminho do wsdl> <diretório para gravar os arquivos gerados>

    Qq dúvida, é só digitar bprowsdldoc no Proenv q ele te mostra as opções..

    ;)
  4. TrombiniSP

    TrombiniSP Membro Participativo

    Quando eu falo WSDL Analyzer é sobre este comando que me refiro.

    Obrigado.
  5. TrombiniSP

    TrombiniSP Membro Participativo

    Mais alguém passou por isso? Ou melhor, tem a solução?
  6. Fabian

    Fabian Sem Pontuação

    Trombini, bom dia,

    Estamos com esse mesmo problema, nos retorna: Error receiving Web Service Response: Bad Request. Status code 400 received. (11773)". Como conseguistes resolver?

Compartilhe esta Página