处理来自WinHttpRequest的事件

时间:2011-02-26 03:46:07

标签: events vbscript httpwebrequest

我使用的程序运行.VBS脚本

那么,在 VBScript 中,如何处理 WinHttpRequest 对象的 OnResponseFinished 事件?

Set oHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")
oHTTP.Open "GET", "http://www.google.com", True
oHTTP.Send

7 个答案:

答案 0 :(得分:2)

我试图在winhttp响应到来时执行一些代码(在HTA文件中使用VBScript)。您可以考虑在发送后立即放置事件代码。使用以下代码,用户界面在等待响应时不会挂起:

Set objHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")
objHTTP.Open "GET", "http://www.google.com", True
objHTTP.Send
objHTTP.WaitForResponse 'pauses execution, but does not hang UI
'from now on, execution only takes effect after completion of the response:
msgbox objHTTP.responseText 'an example of what can be done with the response

这似乎与脚本文件的同步winhttp相同,这可能是您正在寻找的。因此,使用用户界面时可能会注意到唯一的区别。

答案 1 :(得分:1)

将调用中的第三个参数更改为Open方法为false。然后在调用send之后放置OnResponseFinished中的代码。

答案 2 :(得分:1)

使用WScript的CreateObject而不是内置的事件处理程序。

Set oHTTP = WScript.CreateObject(
    "WinHttp.WinHttpRequest.5.1",
    "oHTTP_"
)

答案 3 :(得分:0)

我承认他的答案不是很好,但注册VBScript事件的常用方法是使用GetRef函数来获取对事件处理程序的引用,例如使用MSXML2.XMLHTTP对象:

Set oHTTP = CreateObject("MSXML2.XMLHTTP")
oHTTP.Open "GET", "http://www.google.com", True

oHTTP.OnReadyStateChange = GetRef("oHTTP_OnReadyStateChange")

Sub oHTTP_OnReadyStateChange
    ' do something
End sub

oHTTP.Send

麻烦的是,我为你的代码尝试了它,即

Set oHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")
oHTTP.Open "GET", "http://www.google.com", True

oHTTP.OnResponseFinished = GetRef("oHTTP_OnResponseFinished")

Sub oHTTP_OnResponseFinished
    ' do something
End sub

oHTTP.Send

它没有用,得到错误

  

Object不支持此属性或方法:'oHTTP.OnResponseFinished'

但也许这可以给你一个起点,或者你可以使用MSXML2库来代替?

只需使用其他处理COM事件的方式更新此答案 - 使用CreateObject函数的第二个参数,它允许您指定将函数连接到对象的函数前缀,例如

Set oHTTP = CreateObject("WinHttp.WinHttpRequest.5.1", "oHTTP_")
oHTTP.Open "GET", "http://www.google.com", True

Sub oHTTP_OnResponseFinished
    ' do something
End sub

oHTTP.Send

不幸的是,这也不起作用 - 必须是IWinHttpRequestEvents界面无法访问

答案 4 :(得分:0)

我检查了Windows注册表,似乎有许多Microsoft对象做了几乎相同的事情:

Microsoft.XMLHTTP {ED8C108E-4349-11D2-91A4-00C04F7969E8}
MSXML2.XMLHTTP {F6D90F16-9C73-11D3-B32E-00C04F990BB4}
WinHttp.WinHttpRequest.5.1 {2087c2f4-2cef-4953-a8ab-66779b670495}
MSXML2.ServerXMLHTTP {AFBA6B42-5692-48EA-8141-DC517DCF0EF1}

对我有用的是Microsoft.ServerXMLHTTP,它允许在VBScript中设置onreadystatechange。 “MSXML2.ServerXMLHTTP”处理重定向网站(例如google.com),使其成为比“Microsoft.XMLHTTP”更好的选择。

Dim xmlhttp ' global so can be accessed in OnStateChange

Sub OnStateChange
    If xmlhttp.readystate = 4 Then
        ' React to xmlhttp.responseText
        MsgBox xmlhttp.responseText
    End If
End Sub

Set xmlhttp = CreateObject("Microsoft.XMLHTTP")
xmlhttp.open "GET", "http://www.google.com/", true
xmlhttp.onreadystatechange = GetRef("OnStateChange")
xmlhttp.send
' do something else whilst xmlhttp is running in the background
MsgBox "Pausing so that OnStateChange can fire!"

答案 5 :(得分:0)

根据this(转到备注)似乎确实需要您只能使用Err访问错误状态。微软的文档很糟糕。

答案 6 :(得分:0)

我发现我可以通过使用' waitForResponse'来异步工作。参数' 0'将超时方法作为标志。

IE:

 oHTTP.Open "GET", "http://www.google.com", True
 oHTTP.Send

 Do While oHTTP.waitForResponse(0) = False
   'do stuff while waiting for it to be done

    WScript.Sleep 200 'sleep for 0.2 seconds between checks as not waste CPU 
    DoEvents
 Loop

 'Once the loop is exited, the response is finished
 MsgBox oHTTP.ResponseText