HTTP-ВХОД в VBS

#vbscript #xml-rpc

Вопрос:

Есть ли способ выполнить HTTP-запрос GET в скрипте Visual Basic? Мне нужно получить содержимое ответа с определенного URL-адреса для обработки.

Ответ №1:

 Dim o
Set o = CreateObject("MSXML2.XMLHTTP")
o.open "GET", "http://www.example.com", False
o.send
' o.responseText now holds the response as a string.
 

Комментарии:

1. Просто чтобы добавить третий параметр bool, представляющий, должен ли вызов быть асинхронным или синхронизированным. Значение False означает, что это будет синхронный вызов. Кроме того, открытый API имеет еще два параметра для аутентификации для передачи идентификатора пользователя и пароля, если это требуется для вызываемого веб-сайта.

2. У меня возникли проблемы с использованием этого метода в Windows 2012, я думаю, что это связано с большим количеством различных версий, выпущенных Microsoft. Я подумываю об использовании метода antoher для получения HTTP из vbs, есть идеи??

3. Простой пример для простого вопроса. Мне потребовалось 2 часа, чтобы найти это, и это все, что мне было нужно. Браво!

Ответ №2:

На момент написания статьи вы не описали, что собираетесь делать с ответом или каков его тип содержимого. Ответ уже содержит очень простое использование MSXML2.XMLHTTP (я рекомендую более явный MSXML2.XMLHTTP.3.0 ProgID), однако вам может потребоваться сделать с ответом разные вещи, это может быть не текст.

XMLHTTP также имеет responseBody свойство, представляющее собой версию ответа в виде массива байтов, и есть responseStream IStream оболочка для ответа.

Обратите внимание, что в требованиях на стороне сервера (например, VBScript, размещенный в ASP), вы бы использовали MSXML.ServerXMLHTTP.3.0 или WinHttp.WinHttpRequest.5.1 (который имеет почти идентичный интерфейс).

Вот пример использования XmlHttp для извлечения PDF-файла и его сохранения:-

 Dim oXMLHTTP
Dim oStream

Set oXMLHTTP = CreateObject("MSXML2.XMLHTTP.3.0")

oXMLHTTP.Open "GET", "http://someserver/folder/file.pdf", False
oXMLHTTP.Send

If oXMLHTTP.Status = 200 Then
    Set oStream = CreateObject("ADODB.Stream")
    oStream.Open
    oStream.Type = 1
    oStream.Write oXMLHTTP.responseBody
    oStream.SaveToFile "c:somefolderfile.pdf"
    oStream.Close
End If
 

Комментарии:

1. эй, Энтони! Как бы мы указывали ключи аутентификации или запрашивали аргументы извне? или мы можем просто оставить это частью URL-адреса.

2. @SushantKhurana: Это будет зависеть от того, что ожидает сервер. Вы включаете дополнительные заголовки в запрос с помощью метода AddHeader, поэтому, если у вас есть контроль над обоими концами, вы создаете собственный заголовок «x-myheader». Или вы можете использовать «СООБЩЕНИЕ», добавить заголовок типа содержимого, например «application/x-www-form-urlencoded», и передать методу параметр продолжения строки с urlencoded send . Или, как вы говорите, включите значения в строку запроса. Это действительно зависит от того, что у вас есть в наличии на сервере.

3. ДА. Я должен сделать это только с помощью базового заголовка авторизации HTTP. Пример авторизации: Базовый QWxhZGRpbjpvcGVuIHNlc2FtZQ==

4. @SushantKhurana@ Для базовой авторизации просто укажите имя пользователя и пароль в качестве 4-го и 5-го параметров в open вызове метода XMLHttp.

Ответ №3:

Если вы используете запрос GET для фактической ОТПРАВКИ данных…

проверьте: http://techhelplist.com/index.php/tech-tutorials/37-windows-troubles/60-vbscript-sending-get-request

Проблема с MSXML2.XMLHTTP заключается в том, что существует несколько его версий с разными именами в зависимости от версии ОС Windows и исправлений.

это объясняет это: http://support.microsoft.com/kb/269238

мне больше повезло с использованием vbscript для вызова

 set ID = CreateObject("InternetExplorer.Application")
IE.visible = 0
IE.navigate "http://example.com/parser.php?key=" amp; value amp; "key2=" amp; value2 
do while IE.Busy.... 
 

….и еще кое-что, но только для того, чтобы запрос прошел.

Комментарии:

1. Это просто некрасиво и неэффективно, зачем вам это делать? Каждый раз, когда вы вызываете этот код, вы создаете экземпляр iexplore.exe в фоновом режиме, который затем вызывает winsock.dll для обработки HTTP-запроса, когда объекты HTTP-запроса сервера выполняют это напрямую с гораздо меньшими затратами.

Ответ №4:

         strRequest = "<soap:Envelope xmlns:soap=""http://www.w3.org/2003/05/soap-envelope"" " amp;_
         "xmlns:tem=""http://tempuri.org/"">" amp;_
         "<soap:Header/>" amp;_
         "<soap:Body>" amp;_
            "<tem:Authorization>" amp;_
                "<tem:strCC>"amp;1234123412341234amp;"</tem:strCC>" amp;_
                "<tem:strEXPMNTH>"amp;11amp;"</tem:strEXPMNTH>" amp;_
                "<tem:CVV2>"amp;123amp;"</tem:CVV2>" amp;_
                "<tem:strYR>"amp;23amp;"</tem:strYR>" amp;_
                "<tem:dblAmount>"amp;1235amp;"</tem:dblAmount>" amp;_
            "</tem:Authorization>" amp;_
        "</soap:Body>" amp;_
        "</soap:Envelope>"

        EndPointLink = "http://www.trainingrite.net/trainingrite_epaysystem" amp;_
                "/trainingrite_epaysystem/tr_epaysys.asmx"



dim http
set http=createObject("Microsoft.XMLHTTP")
http.open "POST",EndPointLink,false
http.setRequestHeader "Content-Type","text/xml"

msgbox "REQUEST : " amp; strRequest
http.send strRequest

If http.Status = 200 Then
'msgbox "RESPONSE : " amp; http.responseXML.xml
msgbox "RESPONSE : " amp; http.responseText
responseText=http.responseText
else
msgbox "ERRCODE : " amp; http.status
End If

Call ParseTag(responseText,"AuthorizationResult")

Call CreateXMLEvidence(responseText,strRequest)

'Function to fetch the required message from a TAG
Function ParseTag(ResponseXML,SearchTag)

 ResponseMessage=split(split(split(ResponseXML,SearchTag)(1),"</")(0),">")(1)
 Msgbox ResponseMessage

End Function

'Function to create XML test evidence files
Function CreateXMLEvidence(ResponseXML,strRequest)

 Set fso=createobject("Scripting.FileSystemObject")
 Set qfile=fso.CreateTextFile("C:UsersRajkumarJoshuaDesktopDCIMSampleResponse.xml",2)
 Set qfile1=fso.CreateTextFile("C:UsersRajkumarJoshuaDesktopDCIMSampleReuest.xml",2)

 qfile.write ResponseXML
 qfile.close

 qfile1.write strRequest
 qfile1.close

End Function
 

Комментарии:

1. Вам нужно иметь некоторые комментарии, чтобы дополнить свой код.