Обработка событий из WinHttpRequest - PullRequest
3 голосов
/ 26 февраля 2011

Используемая мной программа запускает сценарии .VBS

Итак, в VBScript как вы можете обработать событие OnResponseFinished для объекта WinHttpRequest ?

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

Ответы [ 7 ]

2 голосов
/ 16 июня 2014

Я пытался выполнить некоторый код при получении ответа winhttp (используя VBScript внутри файла HTA).Вы можете добавить код события сразу после отправки.Используя следующий код, пользовательский интерфейс не зависает при ожидании ответа:

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 голос
/ 06 января 2012

Используйте WScript CreateObject, а не встроенный для обработчика событий.

Set oHTTP = WScript.CreateObject(
    "WinHttp.WinHttpRequest.5.1",
    "oHTTP_"
)
1 голос
/ 26 февраля 2011

Измените третий параметр в вызове метода Open на false.Затем поместите код, который будет у вас в OnResponseFinished после вызова для отправки.

0 голосов
/ 23 мая 2014

Я обнаружил, что могу заставить это работать асинхронно, используя '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
0 голосов
/ 29 августа 2012

По-видимому, это возможно в соответствии с this (перейдите к комментариям), вы можете получить доступ к состоянию ошибки только с помощью Err. Документация Microsoft паршивая.

0 голосов
/ 13 января 2012

Я проверил реестр 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, который позволяет устанавливать onreadystatechange в VBScript. «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!"
0 голосов
/ 26 февраля 2011

Я признаю, что это не очень хороший ответ, но обычный способ регистрации событий 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 not ''t не поддерживает это свойство или метод: '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 интерфейс недоступен

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...