WinHttpRequest超时

时间:2015-09-16 19:21:43

标签: autohotkey winhttp winhttprequest

我使用AHK脚本发送一些POST请求。 我试图获得超时响应,因此我可以向用户弹出一些消息。 我无法弄清楚如何使用" SetTimeouts"方法和" WaitForResponse" 见下面的代码

WebRequest := ComObjCreate("WinHttp.WinHttpRequest.5.1")
WebRequest.SetTimeouts(3000,3000,3000,3000)

openConnection(WebRequest,ip){
   WebRequest.Open("POST", "http://" ip "/cgi/drsLogin",true)
   WebRequest.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
   WebRequest.Send("action=login&username=admin&password=admin")
   time := WebRequest.WaitForResponse(2)

   if (time = -1) {
    addTextToGui("Connection Timeout")
   }
   else{
     return
   }
 return
}

2 个答案:

答案 0 :(得分:4)

AutoHotkey喜欢函数中的值被引号包围。

尝试更改:

WebRequest.SetTimeouts(3000,3000,3000,3000)

WinHttpReq.SetTimeouts("30000", "30000", "30000", "30000")

编辑:好吧,看来我错了,两种方法都有效。

我使用此网站测试了上述内容:http://tmplinshi.sinaapp.com/test/timeout-test-20s.php

在下面的代码中SetTimouts设置为10秒我们的测试设置为在20秒内响应,这样可以保证超时。

WinHttpReq := ComObjCreate("WinHttp.WinHttpRequest.5.1")
WinHttpReq.SetTimeouts("10000", "10000", "10000", "10000")
WinHttpReq.Open("GET", "http://tmplinshi.sinaapp.com/test/timeout-test-20s.php", false)
WinHttpReq.Send()
WinHttpReq.WaitForResponse()
webpage := WinHttpReq.ResponseText
MsgBox % webpage
  

我收到了超时错误,但这会破坏脚本并仍然无法解答如何拉出超时消息?

好吧,因为我们收到超时错误,这意味着我们需要在代码中添加错误处理。我们将使用Try / Catch执行此操作。

WinHttpReq := ComObjCreate("WinHttp.WinHttpRequest.5.1")
WinHttpReq.SetTimeouts("10000", "10000", "10000", "10000")

Try { 
WinHttpReq.Open("GET", "http://tmplinshi.sinaapp.com/test/timeout-test-20s.php", false)
WinHttpReq.Send()
WinHttpReq.WaitForResponse()
webpage := WinHttpReq.ResponseText
}
Catch e{
    MsgBox % e
    ExitApp
}

MsgBox % webpage
  

好的,脚本不再中断,但MsgBox是空白的?这不起作用!

它是空白的,因为我们的错误消息是作为对象从对象返回的!检查e对象我发现它包含几个键,将数据存储为字符串,甚至是整数值。键标记为:Extra,File,Line,Message和What ...所以让我们来看看Message!

WinHttpReq := ComObjCreate("WinHttp.WinHttpRequest.5.1")
WinHttpReq.SetTimeouts("10000", "10000", "10000", "10000")

Try { 
WinHttpReq.Open("GET", "http://tmplinshi.sinaapp.com/test/timeout-test-20s.php", false)
WinHttpReq.Send()
WinHttpReq.WaitForResponse()
webpage := WinHttpReq.ResponseText
}
Catch e{
    MsgBox % e.Message
    ExitApp
}

MsgBox % webpage
  

好的,现在我看到了:

     

0x80072EE2 -
  资料来源:WinHttp.WinHttpRequest

     

说明:操作超时

     

HelpFile :( null)

     

HelpContext:0

是的,看来我们得到了Timed Out消息和一些我们可能不想要的其他信息。所以我们现在可以做的就是从消息中解析出我们想要的数据!像这样:

WinHttpReq := ComObjCreate("WinHttp.WinHttpRequest.5.1")
WinHttpReq.SetTimeouts("10000", "10000", "10000", "10000")

Try { 
WinHttpReq.Open("GET", "http://tmplinshi.sinaapp.com/test/timeout-test-20s.php", false)
WinHttpReq.Send()
WinHttpReq.WaitForResponse()
webpage := WinHttpReq.ResponseText
}
Catch e{
    For Each, Line in StrSplit(e.Message, "`n", "`r") {
        Results := InStr(Line, "Description:") 
            ? StrReplace(Line, "Description:")
            : ""
        If (Results <> "")
            Break
    }
    MsgBox % Trim(Results)
    ExitApp
}

MsgBox % webpage

编辑:

忘记提及此方法不仅会捕获超时,还会出现其他各种错误,例如无法访问的地址或无效的网址,它会正确显示这些错误。

您可以通过转到http://www.isitdownrightnow.com/并尝试在已关闭的网站上使用上面的代码来自行测试。你会看到它返回:

  

无法解析服务器名称或地址

同时将不属于的字符或空格添加到代码生成的URL中:

  

网址无效

答案 1 :(得分:2)

这是另一种方法。它更具可读性,允许您设置总超时时间,而不是您通常不关心的不同较低级别超时时间。

WinHttpReq := ComObjCreate("WinHttp.WinHttpRequest.5.1")

timedOut := False
WinHttpReq.Open("GET", "http://google.com", True)
WinHttpReq.Send()
Sleep, 1     ;timeout: 1 millisecond (will time out)
;Sleep, 4000 ;timeout: 4 seconds (should not time out)

ComObjError(False)
WinHttpReq.Status
If (A_LastError) ;if WinHttpReq.Status was not set (no response received yet)
    timedOut := True
ComObjError(True)

If (timedOut)
    MsgBox, timed out
Else
    MsgBox, didn't time out