WinHttpRequest 超时
Posted
技术标签:
【中文标题】WinHttpRequest 超时【英文标题】:WinHttpRequest timeouts 【发布时间】:2015-12-13 12:48:19 【问题描述】:我正在使用 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
【问题讨论】:
【参考方案1】: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
说明:操作超时
帮助文件:(空)
帮助上下文:0
是的,我们似乎收到了超时消息和一堆我们可能不想要的其他信息。所以我们现在能做的就是从消息中解析出我们想要的数据!像这样:
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
编辑:
忘了说这个方法不仅会捕获超时,还会捕获各种其他错误,例如无法访问的地址或无效的 URL,它会正确显示这些错误。
您可以通过访问http://www.isitdownrightnow.com/ 并尝试在已关闭的站点上使用上面的代码来亲自测试这些。你会看到它返回:
无法解析服务器名称或地址
还将不属于的字符或空格添加到代码生成的 URL:
网址无效
【讨论】:
【参考方案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
【讨论】:
以上是关于WinHttpRequest 超时的主要内容,如果未能解决你的问题,请参考以下文章
WinHttp.WinHttpRequest 添加到内容类型
如何异步使用“WinHttp.WinHttpRequest.5.1”?
Msxml2.ServerXMLHTTP 和 WinHttp.WinHttpRequest 之间的区别?
通过 WinHttpRequest 将多个测量值发布到 influxDB 的正确行分隔符是啥?