Testar se um WS está online

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Testar se um WS está online

Mensagem por asimoes »

Olá Pessoal,

Tem como saber se um serviço WS está online e como eu posso recuperar a mensagem de erro, estou usando MSXML2.ServerXMLHTTP
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Testar se um WS está online

Mensagem por sygecom »

Mestre,
Essa resposta não é tão simples, por que o LINK pode está on-line mas o serviço do WS fora do AR.

Para ver o link, pode usar por exemplo:

Código: Selecionar todos

FUNCTION MAIN()
INETESTACONECTADA('ws.nomeservico.com.br')
RETURN NIL

FUNCTION INETESTACONECTADA(cAddress)
LOCAL cIp, lRET := .F.
Local cITME_START:=TIME()
LOCAL cITME_END  :=''

IF cAddress = NIL
   cAddress := "www.google.com"
ENDIF

WsaStartUp()

cIp := GETHOSTBYNAME( cAddress )

WsaCleanUp()

lRET:=cIp<>"0.0.0.0"

cITME_END  :=TIME()
IF TimeToSec(ElapTime(cITME_START,cITME_END)) > 5
   lRET:=.F.
ENDIF
Mas para saber se o serviço está rodando no link, é outro assunto, para isso vai ter que ver as possíveis respostas que tem na url que está consumindo.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

Testar se um WS está online

Mensagem por Kapiaba »

Código: Selecionar todos

//-> Funcao para checar a Internet
FUNCTION IsInternet()

   LOCAL cIp, cVret := .F.

   WsaStartUp()

   cIp := GETHOSTBYNAME( "microsoft.com" )
   cIp := GETHOSTBYNAME( "microsoft.com" )

   WsaCleanUp()

   // Seguranca caso o provedor da microsoft esteja fora do ar...
   IF ( cIp <= "0.0.0.0" )

      WsaStartUp()

      cIp := GetHostByName( "google.com" )
      cIp := GetHostByName( "google.com" )

      WsaCleanUp()

   ENDIF

RETURN( cIp<>"0.0.0.0" )
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Testar se um WS está online

Mensagem por JoséQuintas »

De repente, se existe uma resposta padrão pra quando está ok, só testar se a mensagem é diferente de ok.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Testar se um WS está online

Mensagem por asimoes »

O erro ocorre no método post, se o serviço está ok, o método loadsml funciona sem problemas, a minha ideia seria testar antes do post
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Testar se um WS está online

Mensagem por asimoes »

Prezados bom dia,

Quais as libs para as funções GETHOSTBYNAME, WsaStartUp e WSACLEANUP ?
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Testar se um WS está online

Mensagem por JoséQuintas »

Uso assim:

Código: Selecionar todos


FUNCTION IsInternet( cUrl, nPort )

   LOCAL lOk := .F. , aAddr

   hb_Default( @cUrl, "www.google.com" )
   hb_Default( @nPort, 80 )
   aAddr := hb_socketResolveINetAddr( cUrl, nPort )
   IF ! Empty( aAddr )
      lOk := hb_socketConnect( hb_socketOpen(), aAddr, 2000 )
   ENDIF

   RETURN lOk
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Testar se um WS está online

Mensagem por asimoes »

Quintas,

Testei sua função retorna .f., pelo google vejo os métodos do ws, passando a url
2021-02-04 14_27_28-Window.png
2021-02-04 14_27_28-Window.png (5.41 KiB) Exibido 1552 vezes
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

Testar se um WS está online

Mensagem por Kapiaba »

O código do mister Quintas funciona bem com Harbour.
QUINTAS2.png
Abs.
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Testar se um WS está online

Mensagem por asimoes »

Kapiava, obrigado eu estou interessado no insucesso, na falha eu fiz assim

Código: Selecionar todos

cBuffer := oPg:responseText

lSuccesso := oXMLDoc:loadXML( cBuffer )
Se o lSucesso for false, então houve falha na leitura do xml

Aqui essas funções não entendem uma url de um ws sempre vem ,t,, mesmo passando um endereço errado,
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Testar se um WS está online

Mensagem por asimoes »

Sempre vem falso o passando a url do ws
2021-02-04 14_27_28-Window.png
2021-02-04 14_27_28-Window.png (5.41 KiB) Exibido 1501 vezes
lret := IsInternet( cUrl )

A url eu passei na barra de endereços do google

Código: Selecionar todos

FUNCTION IsInternet( cUrl, nPort )

   LOCAL lOk := .F. , aAddr

   hb_Default( @cUrl, "www.google.com" )
   hb_Default( @nPort, 80 )
   aAddr := hb_socketResolveINetAddr( cUrl, nPort )
   IF ! Empty( aAddr )
      lOk := hb_socketConnect( hb_socketOpen(), aAddr, 2000 )
   ENDIF

   RETURN lOk
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
rosalvo rosa
Usuário Nível 3
Usuário Nível 3
Mensagens: 156
Registrado em: 10 Jan 2006 19:21
Localização: Curitiba - PR

Testar se um WS está online

Mensagem por rosalvo rosa »

Olá amigos

O colega ASIMOES perguntou mas eu não vi a resposta, por isso pergunto também:

Quais as libs para as funções GETHOSTBYNAME, WsaStartUp e WSACLEANUP ?
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Testar se um WS está online

Mensagem por Itamar M. Lins Jr. »

Olá!
Pelo que andei estudando, essas funções são protótipos para usar a DLL do windows. "wsock32.dll"

Código: Selecionar todos

DLL32 FUNCTION WSAStartup(n AS LONG, pStruct AS LPSTR) AS LONG PASCAL FROM "WSAStartup" LIB "wsock32.dll"
DLL32 FUNCTION WSACleanup() AS LONG PASCAL FROM "WSACleanup" LIB "wsock32.dll"
DLL32 FUNCTION closesocket(af AS LONG) AS WORD PASCAL FROM "closesocket" LIB "wsock32.dll"
DLL32 FUNCTION MemCopy(dest AS LPSTR, src AS LPSTR, cb AS LONG ) AS VOID PASCAL FROM "RtlMoveMemory" LIB "Kernel32.dll"
DLL32 FUNCTION socket(af AS LONG, s_type AS LONG, protocol AS LONG ) AS LONG PASCAL FROM "socket" LIB "wsock32.dll"
DLL32 FUNCTION setsockopt(s AS LONG,level AS LONG,optname AS LONG,optval AS LPSTR,optlen AS LONG) AS LONG PASCAL FROM "setsockopt" LIB "wsock32.dll"
DLL32 FUNCTION getsockopt(s AS LONG,level AS LONG,optname AS LONG,optval AS LPSTR,optlen AS LONG) AS LONG PASCAL FROM "getsockopt" LIB "wsock32.dll"
DLL32 FUNCTION htonl(hostlong AS LONG) AS LONG PASCAL FROM "htonl" LIB "wsock32.dll"
DLL32 FUNCTION htons(hostshort AS LONG) AS WORD PASCAL FROM "htons" LIB "wsock32.dll"
DLL32 FUNCTION bind(s AS LONG, pStruct AS LPSTR,namelen AS LONG) AS LONG PASCAL FROM "bind" LIB "wsock32.dll"
DLL32 FUNCTION inet_addr(cp AS STRING) AS LONG PASCAL FROM "inet_addr" LIB "wsock32.dll"
DLL32 FUNCTION inet_ntoa(nip AS LONG) AS STRING PASCAL FROM "inet_ntoa" LIB "wsock32.dll"
DLL32 FUNCTION WSAAsyncSelect(s AS LONG, hWnd AS LONG, wMsg AS LONG, lEvent AS LONG) AS LONG PASCAL FROM "WSAAsyncSelect" LIB "wsock32.dll"
DLL32 FUNCTION recv(s AS LONG, Buf AS LPSTR, buflen AS LONG, flags AS LONG) AS LONG PASCAL FROM "recv" LIB "wsock32.dll"
DLL32 FUNCTION recvfrom(s AS LONG, Buf AS LPSTR, buflen AS LONG, flags AS LONG, pStruct AS LPSTR, namelen AS LONG) AS LONG PASCAL FROM "recvfrom" LIB "wsock32.dll"
DLL32 FUNCTION send(s AS LONG, Buf AS LPSTR, buflen AS LONG, flags AS LONG) AS LONG PASCAL FROM "send" LIB "wsock32.dll"
DLL32 FUNCTION sendto(s AS LONG, Buf AS LPSTR, buflen AS LONG, flags AS LONG, addr AS LPSTR, i AS LONG) AS LONG PASCAL FROM "sendto" LIB "wsock32.dll"
DLL32 FUNCTION WSAGetLastError() AS LONG PASCAL FROM "WSAGetLastError" LIB "wsock32.dll"
No Harbour temos as funções nativas para isso INET e SOCKETS(acredito)
hb_socketOpen()
hb_socketConnect()
hb_socketGetHostName()
...
Caso queira usar a DLL veja como são os parametros para usar ai em cima com o Harbour
DllLoad("wsock32.dll")

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Testar se um WS está online

Mensagem por rochinha »

Amiguinhos,

Para saber qual tipo de erro é retornado quando feita automação com MSXML2.ServerXMLHTTP ou Microsoft.XMLHTTP pode-se usar o retorno da variável status.

Código: Selecionar todos

   oAutomacao := TOleAuto():New( "Microsoft.XMLHTTP" )
   oAutomacao:Open( ... )
   ...
   oAutomacao:Send( ... )
   cStringJSON := oAutomacao:responseText
   If     oAutomacao:Status == 200
          cAutomacaoStatus := "200-Success"
          do While oAutomacao:readyState != 4 // 0-UNSENT: Um cliente foi criado. Mas o m?do open()  n?foi chamado ainda. 1-OPENED: O m?do open() foi chamado. 2-HEADERS_RECEIVED: o m?do send() foi chamado e os cabe?hos e status est?dispon?is. 3-LOADING: Baixando e responseText contem os dados parciais. 4-DONE: Opera? conclu?.
             oAutomacao:WaitForResponse(1000)
          Enddo
          ? cAutomacaoStatus,,cAutomacao:responseText
   ElseIf oAutomacao:Status == 400
          cAutomacaoStatus := "400-Requisição Mal Formada"
          ? cAutomacaoStatus,,oAutomacao:responseText
   ElseIf oAutomacao:Status == 401
          cAutomacaoStatus := "401-Requisição Requer Autenticação"
          ? cAutomacaoStatus,,oAutomacao:responseText
   ElseIf oAutomacao:Status == 403
          cAutomacaoStatus := "403-Requisição Negada"
          ? cAutomacaoStatus,,oAutomacao:responseText
   ElseIf oAutomacao:Status == 404
          cAutomacaoStatus := "404-Recurso não Encontrado"
          ? cAutomacaoStatus,,oAutomacao:responseText
   ElseIf oAutomacao:Status == 405
          cAutomacaoStatus := "405-Método não Permitido"
          ? cAutomacaoStatus,,oAutomacao:responseText
   ElseIf oAutomacao:Status == 408
          cAutomacaoStatus := "408-Tempo esgotado para a requisição"
          ? cAutomacaoStatus,,oAutomacao:responseText
   ElseIf oAutomacao:Status == 413
          cAutomacaoStatus := "413-Requisição excede o tamanho máximo permitido"
          ? cAutomacaoStatus,,oAutomacao:responseText
   ElseIf oAutomacao:Status == 415
          cAutomacaoStatus := "415-Tipo de mídia inválida (falta de informar o content-type correto, ver JSON)"
          ? cAutomacaoStatus,,oAutomacao:responseText
   ElseIf oAutomacao:Status == 429
          cAutomacaoStatus := "429-Requisição excede a quantidade máxima de chamadas permitidas à API"
          ? cAutomacaoStatus,,oAutomacao:responseText
   Else
          cAutomacaoStatus := "No Error Configured"
          cStringJSON := ""
   Endif
...
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Testar se um WS está online

Mensagem por asimoes »

Obrigado Rochinha,

Já fiz um testes aqui e funcionou, se não vier o status 200 sei que tem erro
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Responder