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 (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.
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 (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