Árvore de páginas

Você está vendo a versão antiga da página. Ver a versão atual.

Comparar com o atual Ver Histórico da Página

« Anterior Versão 16 Próxima »

A classe TWsdlManager faz o tratamento para arquivos WSDL (Web Services Description Language). Esta classe implementa métodos para identificação das informações de envio e resposta das operações definidas, além de métodos para envio e recebimento do documento SOAP.

A classe trabalha com 2 tipos de dados: os tipos complexos, que são as seções do XML, e os tipos simples, que são as tags que recebem valor. Por exemplo, numa operação de inserção de clientes, a tag "cliente" é um tipo complexo, pois contém os dados do cliente dentro, e as uma tag "nome" é um tipo simples, pois recebe diretamente um valor (no caso, o nome do cliente).

TWsdlManager irá realizar o parse de um WSDL, seja por uma URL ou por arquivo, e irá montar internamente uma lista com os tipos simples e outra com os tipos complexos. A lista de tipos complexos terá somente os tipos complexos que tenham número variável de ocorrências. Por exemplo, se tiver 2 tipos complexos onde um deles tem mínimo de 1 e máximo de 1, e outro com mínimo de 1 e máximo 2, só o que tem o valor mínimo diferente do valor máximo irá ser listado.

Através do método NextComplex é possível verificar quais são esses elementos de tipo complexo que necessitam de definição do número de ocorrências. Esse método deve ser chamado em recursão, até não existirem mais elementos retornados (irá retornar Nil). Para cada elemento retornado deve-se definir a quantidade de vezes que a tag irá aparecer no XML final (SOAP). Para isso utiliza-se o método SetComplexOccurs. Caso não seja especificado a quantidade de vezes que a tag irá aparecer, a classe irá considerar a quantidade como 0 (zero).

Caso seja passado zero no método SetComplexOccurs ele irá marcar os elementos simples e complexos dentro da tag para serem ignorados, o que fará com que os elementos complexo internos não apareçam no retorno do método NextComplex, e os elementos simples internos não serão retornados pelo método SimpleInput.

Uma vez definida a quantidade de vezes que os tipos complexos irão aparecer na mensagem SOAP, aí pode chamar o método SimpleInput, para poder retornar quais são os campos que irão receber valor. Os tipos simples podem ter seus valores definidos através dos métodos SetValue (para 1 valor apenas) ou SetValues (para mais de 1 valor). Para saber a quantidade de valores aceitos pelo tipo simples é só olhar a quantidade mínima e máxima informada no método SimpleInput, índices 3 e 4 de cada tag, respectivamente.

Hierarquia

  • TWsdlManager

Construtores

Propriedades

Métodos

Observações

  • Através do método SimpleInput, a classe irá disponibilizar uma lista com os elementos que serão definidos na mensagem SOAP que será enviada. A lista possui o nome dos elementos e o id interno deles. Logo, para definir o valor de um elemento utiliza-se o id do mesmo. Mas é possível também definir o valor passando o nome do elemento, fazendo com que a classe procure o mesmo, seja o primeiro encontrado (métodos SetFirst ou SetFirstArray) ou de acordo com os elementos pai (métodos SetValPar ou SetValParArray), e defina seu valor.
  • WSDL - Web Services Description Language (Linguagem para descrição de web services) é uma linguagem baseada em XML para descrição dos serviços, operações e métodos de um web service. O documento gerado a partir do documento WSDL é no formato SOAP. Para mais informações sobre WSDL acesse o endereço: http://www.w3.org/TR/wsdl.
  • SOAP - Simple Object Access Protocol (Protocolo Simples de Acesso a Objetos) é um protocolo baseado em XML para troca de informações estruturadas em plataforma descentralizada e distribuída, normalmente web services. Para mais informações acesse: http://www.w3.org/TR/soap/.
  • Para obter mais informações dos modelos regulamentados pela W3C - World Wide Web Consortium, acesso o endereço: http://www.w3c.org.
  • Alguns endereços com tutoriais sobre as tecnologias envolvidas podem ser acessados em http://www.w3schools.com/ e http://www.tutorialspoint.com/.

Exemplos

Exemplo 1
User Function Teste()
  Local oWsdl
  Local xRet
  Local aOps := {}, aComplex := {}, aSimple := {}
  
  // Cria o objeto da classe TWsdlManager
  oWsdl := TWsdlManager():New()
  
  // Faz o parse de uma URL
  xRet := oWsdl:ParseURL( "http://wsf.cdyne.com/WeatherWS/Weather.asmx?WSDL" )
  if xRet == .F.
    conout( "Erro: " + oWsdl:cError )
    Return
  endif
  
  aOps := oWsdl:ListOperations()
  
  if Len( aOps ) == 0
    conout( "Erro: " + oWsdl:cError )
    Return
  endif
  
  varinfo( "", aOps )
  
  // Define a operação
  xRet := oWsdl:SetOperation( "GetCityForecastByZIP" )
  //xRet := oWsdl:SetOperation( aOps[1][1] )
  if xRet == .F.
     conout( "Erro: " + oWsdl:cError )
     Return
  endif
  
  aComplex := oWsdl:NextComplex()
  varinfo( "", aComplex )
  
  aSimple := oWsdl:SimpleInput()
  varinfo( "", aSimple )
  
  // Define o valor de cada parâmeto necessário
  xRet := oWsdl:SetValue( 0, "90210" )
  //xRet := oWsdl:SetValue( aSimple[1][1], "90210" )
  if xRet == .F.
    conout( "Erro: " + oWsdl:cError )
    Return
  endif
  
  // Exibe a mensagem que será enviada
  conout( oWsdl:GetSoapMsg() )
  
  // Envia a mensagem SOAP ao servidor
  xRet := oWsdl:SendSoapMsg()
  if xRet == .F.
    conout( "Erro: " + oWsdl:cError )
    Return
  endif
  
  // Pega a mensagem de resposta
  conout( oWsdl:GetSoapResponse() )
  
  if xRet == .F.
    conout( "Erro: " + oWsdl:cError )
    Return
  endif
Return
Exemplo 2
User Function tstComplex()
  Local oWsdl
  Local xRet
  Local aOps := {}
  Local aComplex := {}
  Local aSimple := {}
  Local nPos := 0, nOccurs := 0
  
  oWsdl := TWsdlManager():New()
  
  oWsdl:cSSLCACertFile := "\certs\myconectaca.pem"
  oWsdl:cSSLCertFile := "\certs\000001_cert.pem"
  oWsdl:cSSLKeyFile := "\certs\000001_key.pem"
  
  xRet := oWsdl:ParseURL( "https://homextservicos-siafi.tesouro.gov.br/siafi2014he/services/cpr/manterContasPagarReceber?wsdl" )  
  if xRet == .F.
    conout( "Erro: " + oWsdl:cError )
    Return
  endif
  
  aOps := oWsdl:ListOperations()
  if Len( aOps ) == 0
    conout( "Erro: " + oWsdl:cError )
    Return
  endif 
  
  xRet := oWsdl:SetOperation( "cprDHCadastrarDocumentoHabil" )
  if xRet == .F.
    conout( "Erro: " + oWsdl:cError )
    Return
  endif
  
  aComplex := oWsdl:NextComplex()
  while ValType( aComplex ) == "A"
    varinfo( "aComplex", aComplex )
    
    if ( aComplex[2] == "docOrigem" ) .And. ( aComplex[5] == "cprDHCadastrarDocumentoHabil#1.cprDHCadastrar#1.dadosBasicos#1" )
      nOccurs := 1
    elseif ( aComplex[2] == "pco" ) .And. ( aComplex[5] == "cprDHCadastrarDocumentoHabil#1.cprDHCadastrar#1" )
      nOccurs := 2
    elseif ( aComplex[2] == "pcoItem" ) .And. ( aComplex[5] == "cprDHCadastrarDocumentoHabil#1.cprDHCadastrar#1.pco#1" )
      nOccurs := 2
    elseif ( aComplex[2] == "pcoItem" ) .And. ( aComplex[5] == "cprDHCadastrarDocumentoHabil#1.cprDHCadastrar#1.pco#2" )
      nOccurs := 1
    else
      nOccurs := 0
    endif
    
    xRet := oWsdl:SetComplexOccurs( aComplex[1], nOccurs )
    if xRet == .F.
      conout( "Erro ao definir elemento " + aComplex[2] + ", ID " + cValToChar( aComplex[1] ) + ", com " + cValToChar( nOccurs ) + " ocorrencias" )
      return
    endif
  
    aComplex := oWsdl:NextComplex()
  enddo
  
  if xRet == .F.
    return
  endif
  
  aSimple := oWsdl:SimpleInput()
  varinfo( "aSimple", aSimple )
  
  nPos := aScan( aSimple, {|aVet| aVet[2] == "codUgEmit" .AND. aVet[5] == "cprDHCadastrarDocumentoHabil#1.cprDHCadastrar#1" } )
  xRet := oWsdl:SetValue( aSimple[nPos][1], "158122" )
  
  nPos := aScan( aSimple, {|aVet| aVet[2] == "anoDH" .AND. aVet[5] == "cprDHCadastrarDocumentoHabil#1.cprDHCadastrar#1" } )
  xRet := oWsdl:SetValue( aSimple[nPos][1], "2014" )
  
  nPos := aScan( aSimple, {|aVet| aVet[2] == "codTipoDH" .AND. aVet[5] == "cprDHCadastrarDocumentoHabil#1.cprDHCadastrar#1" } )
  xRet := oWsdl:SetValue( aSimple[nPos][1], "NP" )
  
  nPos := aScan( aSimple, {|aVet| aVet[2] == "dtEmis" .AND. aVet[5] == "cprDHCadastrarDocumentoHabil#1.cprDHCadastrar#1.dadosBasicos#1" } )
  xRet := oWsdl:SetValue( aSimple[nPos][1], "26/12/2014" )
  
  nPos := aScan( aSimple, {|aVet| aVet[2] == "dtVenc" .AND. aVet[5] == "cprDHCadastrarDocumentoHabil#1.cprDHCadastrar#1.dadosBasicos#1" } )
  xRet := oWsdl:SetValue( aSimple[nPos][1], "03/01/2015" )
  
  nPos := aScan( aSimple, {|aVet| aVet[2] == "dtPgtoReceb" .AND. aVet[5] == "cprDHCadastrarDocumentoHabil#1.cprDHCadastrar#1.dadosBasicos#1" } )
  xRet := oWsdl:SetValue( aSimple[nPos][1], "03/01/2015" )
  
  nPos := aScan( aSimple, {|aVet| aVet[2] == "dtAteste" .AND. aVet[5] == "cprDHCadastrarDocumentoHabil#1.cprDHCadastrar#1.dadosBasicos#1" } )
  xRet := oWsdl:SetValue( aSimple[nPos][1], "26/12/2014" )
  
  nPos := aScan( aSimple, {|aVet| aVet[2] == "vlr" .AND. aVet[5] == "cprDHCadastrarDocumentoHabil#1.cprDHCadastrar#1.dadosBasicos#1" } )
  xRet := oWsdl:SetValue( aSimple[nPos][1], "2000.00" )
  
  nPos := aScan( aSimple, {|aVet| aVet[2] == "codUgPgto" .AND. aVet[5] == "cprDHCadastrarDocumentoHabil#1.cprDHCadastrar#1.dadosBasicos#1" } )
  xRet := oWsdl:SetValue( aSimple[nPos][1], "158122" )
  
  nPos := aScan( aSimple, {|aVet| aVet[2] == "codCredorDevedor" .AND. aVet[5] == "cprDHCadastrarDocumentoHabil#1.cprDHCadastrar#1.dadosBasicos#1" } )
  xRet := oWsdl:SetValue( aSimple[nPos][1], "06981180000116" )
  
  nPos := aScan( aSimple, {|aVet| aVet[2] == "txtObser" .AND. aVet[5] == "cprDHCadastrarDocumentoHabil#1.cprDHCadastrar#1.dadosBasicos#1" } )
  xRet := oWsdl:SetValue( aSimple[nPos][1], "TESTE INCLUSAO DH TOTVS" )
  
  nPos := aScan( aSimple, {|aVet| aVet[2] == "numDocOrigem" .AND. aVet[5] == "cprDHCadastrarDocumentoHabil#1.cprDHCadastrar#1.dadosBasicos#1.docOrigem#1" } )
  xRet := oWsdl:SetValue( aSimple[nPos][1], "123456" )
  
  nPos := aScan( aSimple, {|aVet| aVet[2] == "dtEmis" .AND. aVet[5] == "cprDHCadastrarDocumentoHabil#1.cprDHCadastrar#1.dadosBasicos#1.docOrigem#1" } )
  xRet := oWsdl:SetValue( aSimple[nPos][1], "20/01/2010" )
  
  nPos := aScan( aSimple, {|aVet| aVet[2] == "codIdentEmit" .AND. aVet[5] == "cprDHCadastrarDocumentoHabil#1.cprDHCadastrar#1.dadosBasicos#1.docOrigem#1" } )
  xRet := oWsdl:SetValue( aSimple[nPos][1], "654321" )
  
  nPos := aScan( aSimple, {|aVet| aVet[2] == "vlr" .AND. aVet[5] == "cprDHCadastrarDocumentoHabil#1.cprDHCadastrar#1.dadosBasicos#1.docOrigem#1" } )
  xRet := oWsdl:SetValue( aSimple[nPos][1], "100.00" )
  
  nPos := aScan( aSimple, {|aVet| aVet[2] == "numSeqItem" .AND. aVet[5] == "cprDHCadastrarDocumentoHabil#1.cprDHCadastrar#1.pco#1" } )
  xRet := oWsdl:SetValue( aSimple[nPos][1], "1" )
  
  nPos := aScan( aSimple, {|aVet| aVet[2] == "codSit" .AND. aVet[5] == "cprDHCadastrarDocumentoHabil#1.cprDHCadastrar#1.pco#1" } )
  xRet := oWsdl:SetValue( aSimple[nPos][1], "AAA111" )
  
  nPos := aScan( aSimple, {|aVet| aVet[2] == "codUgEmpe" .AND. aVet[5] == "cprDHCadastrarDocumentoHabil#1.cprDHCadastrar#1.pco#1" } )
  xRet := oWsdl:SetValue( aSimple[nPos][1], "7" )
  
  nPos := aScan( aSimple, {|aVet| aVet[2] == "numSeqItem" .AND. aVet[5] == "cprDHCadastrarDocumentoHabil#1.cprDHCadastrar#1.pco#1.pcoItem#1" } )
  xRet := oWsdl:SetValue( aSimple[nPos][1], "1" )
  
  nPos := aScan( aSimple, {|aVet| aVet[2] == "numEmpe" .AND. aVet[5] == "cprDHCadastrarDocumentoHabil#1.cprDHCadastrar#1.pco#1.pcoItem#1" } )
  xRet := oWsdl:SetValue( aSimple[nPos][1], "123456123456" )
  
  nPos := aScan( aSimple, {|aVet| aVet[2] == "codSubItemEmpe" .AND. aVet[5] == "cprDHCadastrarDocumentoHabil#1.cprDHCadastrar#1.pco#1.pcoItem#1" } )
  xRet := oWsdl:SetValue( aSimple[nPos][1], "123" )
  
  nPos := aScan( aSimple, {|aVet| aVet[2] == "vlr" .AND. aVet[5] == "cprDHCadastrarDocumentoHabil#1.cprDHCadastrar#1.pco#1.pcoItem#1" } )
  xRet := oWsdl:SetValue( aSimple[nPos][1], "20.00" )
  
  nPos := aScan( aSimple, {|aVet| aVet[2] == "numSeqItem" .AND. aVet[5] == "cprDHCadastrarDocumentoHabil#1.cprDHCadastrar#1.pco#1.pcoItem#2" } )
  xRet := oWsdl:SetValue( aSimple[nPos][1], "2" )
  
  nPos := aScan( aSimple, {|aVet| aVet[2] == "numEmpe" .AND. aVet[5] == "cprDHCadastrarDocumentoHabil#1.cprDHCadastrar#1.pco#1.pcoItem#2" } )
  xRet := oWsdl:SetValue( aSimple[nPos][1], "654321654321" )
  
  nPos := aScan( aSimple, {|aVet| aVet[2] == "codSubItemEmpe" .AND. aVet[5] == "cprDHCadastrarDocumentoHabil#1.cprDHCadastrar#1.pco#1.pcoItem#2" } )
  xRet := oWsdl:SetValue( aSimple[nPos][1], "321" )
  
  nPos := aScan( aSimple, {|aVet| aVet[2] == "vlr" .AND. aVet[5] == "cprDHCadastrarDocumentoHabil#1.cprDHCadastrar#1.pco#1.pcoItem#2" } )
  xRet := oWsdl:SetValue( aSimple[nPos][1], "30.00" )
  
  nPos := aScan( aSimple, {|aVet| aVet[2] == "numSeqItem" .AND. aVet[5] == "cprDHCadastrarDocumentoHabil#1.cprDHCadastrar#1.pco#2" } )
  xRet := oWsdl:SetValue( aSimple[nPos][1], "99" )
  
  nPos := aScan( aSimple, {|aVet| aVet[2] == "codSit" .AND. aVet[5] == "cprDHCadastrarDocumentoHabil#1.cprDHCadastrar#1.pco#2" } )
  xRet := oWsdl:SetValue( aSimple[nPos][1], "ABCDEF" )
  
  nPos := aScan( aSimple, {|aVet| aVet[2] == "codUgEmpe" .AND. aVet[5] == "cprDHCadastrarDocumentoHabil#1.cprDHCadastrar#1.pco#2" } )
  xRet := oWsdl:SetValue( aSimple[nPos][1], "99" )
  
  nPos := aScan( aSimple, {|aVet| aVet[2] == "numSeqItem" .AND. aVet[5] == "cprDHCadastrarDocumentoHabil#1.cprDHCadastrar#1.pco#2.pcoItem#1" } )
  xRet := oWsdl:SetValue( aSimple[nPos][1], "88" )
  
  nPos := aScan( aSimple, {|aVet| aVet[2] == "numEmpe" .AND. aVet[5] == "cprDHCadastrarDocumentoHabil#1.cprDHCadastrar#1.pco#2.pcoItem#1" } )
  xRet := oWsdl:SetValue( aSimple[nPos][1], "111222333444" )
  
  nPos := aScan( aSimple, {|aVet| aVet[2] == "codSubItemEmpe" .AND. aVet[5] == "cprDHCadastrarDocumentoHabil#1.cprDHCadastrar#1.pco#2.pcoItem#1" } )
  xRet := oWsdl:SetValue( aSimple[nPos][1], "444" )
  
  nPos := aScan( aSimple, {|aVet| aVet[2] == "vlr" .AND. aVet[5] == "cprDHCadastrarDocumentoHabil#1.cprDHCadastrar#1.pco#2.pcoItem#1" } )
  xRet := oWsdl:SetValue( aSimple[nPos][1], "50.00" )
  
  conout( oWsdl:GetSoapMsg() )
  
Return

Abrangência

Builds superiores a 121227P.

  • Sem rótulos