Как я могу отправить HTTP-запрос POST на сервер из Excel, используя VBA?

120

Какой код VBA требуется для выполнения HTTP POST из электронной таблицы Excel?

Теги:
excel-vba
excel
post
http
serverxmlhttp

5 ответов

126
Лучший ответ
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 вы можете использовать WinHttp.WinHttpRequest.5.1 вместо MSXML2.ServerXMLHTTP.

  • 9
    Для большего контроля над HTTP-запросом вы можете использовать «WinHttp.WinHttpRequest.5.1» вместо «MSXML2.ServerXMLHTTP»
  • 5
    Следует отметить, что вы также можете использовать это для выдачи HTTP PUT, изменив «POST» на «PUT». Содержимое для PUT передается в методе .send (). Любые дополнительные заголовки, которые вам нужно установить, могут быть выполнены также в соответствии с синтаксисом, использованным в примере User-Agent.
Показать ещё 2 комментария
49

Если вам нужно работать как на 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.

  • 3
    +1: мне это нужно только в Windows, но кроссплатформенное решение может принести пользу кому-то еще.
  • 0
    Я не думаю, что вы можете получить доступ к HTML-коду, вы можете получить информацию только на отображаемой веб-странице (не фактический HTML-код)
Показать ещё 3 комментария
36

В дополнение к anwser Bill the Lizard:

Большинство бэкэндов анализируют исходные данные. Например, в 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".

  • 0
    Я пытаюсь опубликовать этот запрос (с фигурными скобками) и получить ошибки компиляции ... Можете ли вы помочь: "{" request ": {" carName ":" Honda "," model ":" 1A5 "}}"
5

Вы можете использовать ServerXMLHTTP в проекте VBA, добавив ссылку на MSXML.

  • Откройте редактор VBA (обычно, редактируя макрос)
  • Перейдите к списку доступных ссылок
  • Проверьте Microsoft XML
  • Нажмите "ОК".

(из Ссылка на MSXML в проектах VBA)

Документация ServerXMLHTTP MSDN содержит полную информацию обо всех свойствах и методах ServerXMLHTTP.

Короче говоря, он работает в основном так:

  • 0
    эта ссылка использует JScript, а не VBA
  • 1
    Спасибо @ДжонХенкель. Я внес некоторые изменения, чтобы обновить этот ответ.
0

Я сделал это перед использованием библиотеки MSXML, а затем с помощью объекта XMLHttpRequest. См. http://scriptorium.serve-it.nl/view.php?sid=40

Ещё вопросы

Сообщество Overcoder
Наверх
Меню