我使用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
}
答案 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