#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. Вам нужно иметь некоторые комментарии, чтобы дополнить свой код.