Página 1 de 1

Testar se um WS está online

Enviado: 03 Fev 2021 16:13
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

Testar se um WS está online

Enviado: 04 Fev 2021 09:10
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.

Testar se um WS está online

Enviado: 04 Fev 2021 09:19
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" )

Testar se um WS está online

Enviado: 04 Fev 2021 09:28
por JoséQuintas
De repente, se existe uma resposta padrão pra quando está ok, só testar se a mensagem é diferente de ok.

Testar se um WS está online

Enviado: 04 Fev 2021 09:56
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

Testar se um WS está online

Enviado: 04 Fev 2021 10:06
por asimoes
Prezados bom dia,

Quais as libs para as funções GETHOSTBYNAME, WsaStartUp e WSACLEANUP ?

Testar se um WS está online

Enviado: 04 Fev 2021 11:04
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

Testar se um WS está online

Enviado: 04 Fev 2021 14:30
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 1553 vezes

Testar se um WS está online

Enviado: 05 Fev 2021 13:11
por Kapiaba
O código do mister Quintas funciona bem com Harbour.
QUINTAS2.png
Abs.

Testar se um WS está online

Enviado: 05 Fev 2021 23:28
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,

Testar se um WS está online

Enviado: 05 Fev 2021 23:38
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 1502 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

Testar se um WS está online

Enviado: 11 Fev 2021 19:08
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 ?

Testar se um WS está online

Enviado: 12 Fev 2021 13:47
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.

Testar se um WS está online

Enviado: 21 Fev 2021 15:17
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
...

Testar se um WS está online

Enviado: 22 Fev 2021 01:43
por asimoes
Obrigado Rochinha,

Já fiz um testes aqui e funcionou, se não vier o status 200 sei que tem erro