首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WinHttpRequest超时

WinHttpRequest超时
EN

Stack Overflow用户
提问于 2015-09-16 19:21:42
回答 2查看 9.3K关注 0票数 4

我正在使用AHK脚本发送一些帖子请求。我试图得到一个超时响应,这样我就可以弹出一些消息给用户。我不知道如何使用"SetTimeouts“方法和"WaitForResponse”--请参阅下面的代码

代码语言:javascript
复制
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
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-16 22:32:09

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秒内响应,因此这将保证超时。

代码语言:javascript
复制
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

我得到了一个超时错误,但这破坏了脚本,仍然没有回答如何提取超时消息?

因为我们得到了一个超时错误,这意味着我们需要在代码中添加错误处理。我们将使用试/抓来完成这一任务。

代码语言:javascript
复制
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对象,我发现它包含了几个键,将数据存储为String,甚至包含一个整数值。这些键被标记为: Extra,File,Line,Message,还有什么.所以让我们来看看留言吧!

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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/并尝试在一个名为Down的站点上使用上面的代码来亲自测试这些代码。你会看到它回来的:

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

此外,在代码产生的URL中添加不属于或不属于空格的字符:

URL无效

票数 6
EN

Stack Overflow用户

发布于 2015-09-20 11:14:57

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

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32616959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档