Página 1 de 1

Método Send não refaz em uma segunda chamada

Enviado: 10 Nov 2015 21:19
por asimoes
Pessoal,

Eu estou com um problema no consumo de um webservice onde o método quando chamado pela primeira vez funciona ok, quando é chamado uma segunda vez os dados do xml retornado são os mesmos da primeira chamada. Saindo da aplicação e retornando a chamada do webservice funciona. A impressão que dá é que mesmo atribuindo nil a variável oWebService ela não está finanlizando o objeto.
Fiz um for..next para testar de 1 a 2 no primeiro o send demora, o que é esperado, na segunda vez passa batido e o retorno do xml é o mesmo do primeiro.

Código: Selecionar todos

oWebService   := Win_OleCreateObject("Microsoft.XMLHTTP")
oXMLDoc       := Win_OleCreateObject("Microsoft.XMLDOM")
oXMLDoc:async := .f. 
oWebService:Open( "GET", cUrl ,.f. )
oWebService:Send()
cBuffer := oWebService:responseXML
lSucesso := oXMLDoc:load( cBuffer )
oWebService:=Nil
oXMLDoc:=Nil

Método Send não refaz em uma segunda chamada

Enviado: 10 Nov 2015 22:40
por JoséQuintas
Aqui uso normalmente isso, sem problemas.
Por acaso conferiu o conteúdo de cUrl ou das variáveis envolvidas?

Só comentário:
No Harbour não precisa do NIL, isso era coisa do Visual Basic.

Método Send não refaz em uma segunda chamada

Enviado: 11 Nov 2015 05:18
por Jairo Maia
Olá Pessoal,

Não teria que ter algo como: oXMLDoc:Close() ou oXMLDoc:Quit()?

Método Send não refaz em uma segunda chamada

Enviado: 11 Nov 2015 07:46
por asimoes
Obrigado, Quintas e Jairo pelas respostas,

Quintas a Url está correta, porque traz o xml com o conteúdo esperado, esse xml é um resultado de uma atualização em um banco oracle onde linhas de um campo de uma tabela são marcados com X e neste xml a rotina conta quantos X foram gravados neste campo. Acontece que na pirmeira vez por exemplo o campo com X totaliza 5, sem sair da aplicação e atualizando a tabela no oracle para trazer 3 linhas com X, a aplicação continua trazendo os 5 da primeira vez. Saindo da aplicação e executando novamente traz os 3 esperados.

Jairo os métodos Close() e Quit() não existem XMLDOM

Método Send não refaz em uma segunda chamada

Enviado: 11 Nov 2015 08:10
por asimoes
Pessoal,

Este exemplo mostra o que está acontecendo, na segunda passagem no for..next está trazendo o resultado do primeiro cep

Código: Selecionar todos

 aCep:={"20735050","22280001"}
 For j:=1 to 2
      oWebService:=Win_OleCreateObject("Microsoft.XMLHTTP")
      oXMLDoc    :=Win_OleCreateObject("Microsoft.XMLDOM")
      oXMLDoc:async := .f. 
      cCep:=aCep[j]
      oWebService:Open("GET", "http://cep.republicavirtual.com.br/web_cep.php?cep='" + cCep + "'&formato=xml", .f.)
      oWebService:Send()
      cBuffer := oWebService:responseXml
      lSuccess:=oXMLDoc:load( cBuffer )
      If lSuccess
          // Cria objeto principal       
          oRetorno:=oXMLDoc:getElementsByTagName( "webservicecep" )
          // Leitura do nó
          For I:=1 TO oRetorno:length
             ? oXMLDoc:getElementsByTagName( "resultado" ):item(i-1):Text
             ? oXMLDoc:getElementsByTagName( "resultado_txt" ):item(i-1):Text
             ? oXMLDoc:getElementsByTagName( "uf" ):item(i-1):Text
             ? oXMLDoc:getElementsByTagName( "cidade" ):item(i-1):Text
             ? oXMLDoc:getElementsByTagName( "bairro" ):item(i-1):Text
             ? oXMLDoc:getElementsByTagName( "tipo_logradouro" ):item(i-1):Text
             ? oXMLDoc:getElementsByTagName( "logradouro" ):item(i-1):Text
             InkeyGui(0)
          Next i  
      Endif
      oWebService:=Nil 
      oXMLDoc:=Nil
   Next j

Método Send não refaz em uma segunda chamada

Enviado: 11 Nov 2015 09:02
por Toledo
Alexandre, aqui eu compilei este seu exemplo, mudando apenas os CEPs (o seu segundo CEP não encontrava) e tirei a função InkeyGui(0), ai ficou sem parada, consultando o outro CEP logo em seguida, e funcionou sem problemas.
con_cep.jpg
Compilei usando o Harbour 3.2.

Abraços,

Método Send não refaz em uma segunda chamada

Enviado: 11 Nov 2015 10:13
por Jairo Maia
Alexandre, também tive o mesmo resultado que o Toledo, porém, alterando o 2o. CEP. Em seu exemplo, o CEP 22280001 não retorna dados nem mesmo na consulta dos correios. Tem certeza que é um CEP válido?

Método Send não refaz em uma segunda chamada

Enviado: 11 Nov 2015 14:27
por asimoes
Neste caso do cep 22280001 tudo bem, pelo menos não retornou o 1º

Método Send não refaz em uma segunda chamada

Enviado: 11 Nov 2015 18:07
por asimoes
Pessoal,

Resolvi o problema:

Troquei:
oWebService:=Win_OleCreateObject("Microsoft.XMLHTTP")

Por:
oWebService:=Win_OleCreateObject("MSXML2.ServerXMLHTTP")