Какой код VBA требуется для выполнения HTTP POST из электронной таблицы Excel?
Как я могу отправить HTTP-запрос POST на сервер из Excel с помощью VBA?
Ответы (6)
Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP")
URL = "http://www.somedomain.com"
objHTTP.Open "POST", URL, False
objHTTP.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
objHTTP.send("")
В качестве альтернативы, для большего контроля над HTTP-запросом вы можете использовать _ 2_ вместо MSXML2.ServerXMLHTTP
.
objHTTP.responseText
.
- person Leviathan; 09.01.2017
ByRef
или нет. Вот почему их использование с объектными переменными типа, не имеющего члена по умолчанию, вызывает ошибки времени выполнения; и используя их для объекта, который имеет член по умолчанию, передает значение этого члена по умолчанию вместо фактического объекта.
- person Mathieu Guindon; 11.10.2017
Если вам нужно, чтобы он работал как на Mac, так и на Windows, вы можете использовать QueryTables:
With ActiveSheet.QueryTables.Add(Connection:="URL;http://carbon.brighterplanet.com/flights.txt", Destination:=Range("A2"))
.PostText = "origin_airport=MSN&destination_airport=ORD"
.RefreshStyle = xlOverwriteCells
.SaveData = True
.Refresh
End With
Примечания:
- Что касается вывода ... Я не знаю, можно ли вернуть результаты в ту же ячейку, которая вызвала функцию VBA. В приведенном выше примере результат записывается в A2.
- Что касается ввода ... Если вы хотите, чтобы результаты обновлялись при изменении определенных ячеек, убедитесь, что эти ячейки являются аргументом вашей функции VBA.
- Это не будет работать в Excel для Mac 2008, в котором нет VBA. В Excel для Mac 2011 вернулся VBA.
Для получения дополнительной информации вы можете просмотреть мое полное резюме "об использовании веб-служб из Excel. "
В дополнение к ответу Ящерица Билла:
Большинство бэкэндов анализируют необработанные данные постов. В PHP, например, у вас будет массив $_POST
, в котором будут храниться отдельные переменные в почтовых данных. В этом случае вам необходимо использовать дополнительный заголовок "Content-type: application/x-www-form-urlencoded"
:
Set objHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")
URL = "http://www.somedomain.com"
objHTTP.Open "POST", URL, False
objHTTP.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
objHTTP.setRequestHeader "Content-type", "application/x-www-form-urlencoded"
objHTTP.send ("var1=value1&var2=value2&var3=value3")
В противном случае вам придется читать необработанные данные поста в переменной "$HTTP_RAW_POST_DATA"
.
Чтобы завершить ответ других пользователей:
Для этого я создал объект "WinHttp.WinHttpRequest.5.1".
Отправьте почтовый запрос с некоторыми данными из Excel с помощью VBA:
Dim LoginRequest As Object
Set LoginRequest = CreateObject("WinHttp.WinHttpRequest.5.1")
LoginRequest.Open "POST", "http://...", False
LoginRequest.setRequestHeader "Content-type", "application/x-www-form-urlencoded"
LoginRequest.send ("key1=value1&key2=value2")
Отправьте запрос на получение с аутентификацией токена из Excel с помощью VBA:
Dim TCRequestItem As Object
Set TCRequestItem = CreateObject("WinHttp.WinHttpRequest.5.1")
TCRequestItem.Open "GET", "http://...", False
TCRequestItem.setRequestHeader "Content-Type", "application/xml"
TCRequestItem.setRequestHeader "Accept", "application/xml"
TCRequestItem.setRequestHeader "Authorization", "Bearer " & token
TCRequestItem.send
TCRequestItem Object
, вы можете прочитать его так: TCRequestItem.ResponseText
после выполнения TCRequestItem.send
- person david.q; 18.02.2020
Вы можете использовать ServerXMLHTTP
в проекте VBA, добавив ссылку на MSXML
.
- Откройте редактор VBA (обычно путем редактирования макроса)
- Перейти к списку доступных ссылок
- Проверить Microsoft XML
- Щелкните ОК.
(из Ссылки на MSXML в проектах VBA )
Подробная информация содержится в ServerXMLHTTP MSDN документации. обо всех свойствах и методах ServerXMLHTTP.
Короче говоря, это работает примерно так:
- Вызовите метод open, чтобы подключиться к удаленный сервер
- Вызовите send, чтобы отправить запрос.
- Прочтите ответ через responseXML, responseText, responseStream или responseBody
Я сделал это перед использованием библиотеки MSXML, а затем с помощью объекта XMLHttpRequest, см. здесь.