Vba excel метод post

To complete the response of the other users:

For this I have created an «WinHttp.WinHttpRequest.5.1» object.

Send a post request with some data from Excel using 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")

Send a get request with token authentication from Excel using 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

Excel is a powerful and most popular tool for data analysis! HTTP requests in VBA gives additional capabilities to Excel. XmlHttpRequest object is used to make HTTP requests in VBA. HTTP requests can be used to interact with a web service, API or even websites. Let’s understand how it works.

xmlhttprequest in excel vba

Open an excel file and open VBA editor (Alt + f11) > new module and start writing code in a sub

Public sub XmlHttpTutorial

End Sub

Define XMLHttpRequest

Define http client using following code

Dim xmlhttp as object
Set xmlhttp = CreateObject("MSXML2.serverXMLHTTP")

If you need VBA’s Intellisense autocomplete then do it this way :

First, Add a reference to MSXML (Tools > references)

Select appropriate version based on your PC :
1. Microsoft XML, v 3.0.
2. Microsoft XML, v 4.0 (if you have installed MSXML 4.0 separately).
3. Microsoft XML, v 5.0 (if you have installed Office 2003 – 2007 which provides MSXML 5.0 for Microsoft Office Applications).
4. Microsoft XML, v 6.0 for latest versions of MS Office.

Then define http client

Dim xmlhttp As New MSXML2.XMLHTTP
'Dim xmlhttp As New MSXML2.XMLHTTP60 for Microsoft XML, v 6.0 

VBA Intellisense will show you the right one when you start typing.

Make requests

Requests can be made using open and send methods. Open method syntax is as follows :

xmlhttp.Open Method, URL, async(true or false)

I’m using requestBin to test requests. Create a bin there and send requests to that URL to test requests.

A simple GET request would be :

Dim xmlhttp As New MSXML2.XMLHTTP60, myurl As String
myurl = "http://requestb.in/15oxrjh1" //replace with your URL
xmlhttp.Open "GET", myurl, False
xmlhttp.Send
MsgBox(xmlhttp.responseText)

Run this code, a message box is displayed with the response of the request.

Request headers

Request headers can be set using setRequestHeader method. Examples :

xmlhttp.setRequestHeader "Content-Type", "text/json"
xmlhttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
xmlhttp.setRequestHeader "User-Agent", "Mozilla/5.0 (iPad; U; CPU OS 3_2_1 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Mobile/7B405"
xmlhttp.setRequestHeader "Authorization", AuthCredentials

Simple POST request to send formdata

POST requests are used to send some data, data can be sent in Send method. A simple POST request to send form data :

Public Sub httpclient()
Dim xmlhttp As New MSXML2.XMLHTTP, myurl As String
myurl = "http://requestb.in/15oxrjh1"
xmlhttp.Open "POST", myurl, False
xmlhttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
xmlhttp.Send "name=codingislove&[email protected]"
MsgBox (xmlhttp.responseText)
End Sub

Basic Authentication in VBA

When we need to access web services with basic authentication, A username and password have to be sent with the Authorization header. Username and password should also be base64 encoded. Example :

user = "someusername"
password = "somepassword"
xmlhttp.setRequestHeader "Authorization", "Basic " + Base64Encode(user + ":" + password)

Here’s a paste of utility function that helps to encode string to Base64

Practical use cases

Practical use cases of http requests in VBA are unlimited. Some of them are pulling data from Yahoo finance API, weather API, pulling orders from Ecommerce store admin panel, uploading products, retrieving web form data to excel etc.

Read : Parse HTML in Excel VBA – Learn by parsing hacker news home page where I retrieve a web page using HTTP GET request and parse its HTML to get data from a web page.

Read How to build a simple weather app in Excel VBA where I make a HTTP Get request to weather API

Read JSON Api in Excel VBA where I call JSON Apis using HTTP GET and POST requests.

If you have and questions or feedback, comment below.

  • Author
  • Recent Posts

A CA- by education, self taught coder by passion, loves to explore new technologies and believes in learn by doing.

The question asked here: How can I send an HTTP POST request to a server from Excel using VBA? is almost exactly what I was looking for except that I am trying to send a number of files to the server. I googled further and found How do I upload a zip file via HTTP post using VBA? This was also good, but pretty discouraging — it seems like a lot of work (not just making an HTML form here…).

Option #2 here: http://www.motobit.com/tips/detpg_post-binary-data-url/ (as cited in the question on SO noted above) seems like it would work well, but as I work in JS and CSS, I have no idea how to create FormData (the binary files to send to the server) in the example.

Can anyone please help me? In essence, I want to send 3-6 files over HTTP_POST via VBA from inside Excel to a PHP script on a web server that is expecting form data such as . An HTML form to handle this would look like:

<form action="upload_file.php" method="post" enctype="multipart/form-data">
  <input name="userfile[]" type="file" /><br />
  <input name="userfile[]" type="file" /><br />
  <input name="userfile[]" type="file" /><br />
  <input type="submit" />
</form>

Thank you all in advance.

EDIT — Aug. 2nd 2012

I’m still trying to work on this issue. I don’t know VBA/6, pretty much just basic JS so I am a little lost. Here is what I have done so far:

Sub HTTPInternetPutFile()

    ' create new object with WinHttpRequest for this operation
    Dim WinHttpReq As Object
    Set WinHttpReq = CreateObject("WinHttp.WinHttpRequest.5.1")
    Dim FormFields As String

    ' initialize variables that we will set and pass as parameters
    Dim sfpath
    Dim strURL As String
    Dim StrFileName As String


       StrFileName = "CLIPrDL.csv"
       sfpath = "C:CLIPr"
       strURL = "http://s0106001c10187ab1.gv.shawcable.net/uploadtest/upload_file.php"


       WinHttpReq.Open "POST", strURL, False


       ' Set headers
       WinHttpReq.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
       WinHttpReq.setRequestHeader "Accept-Charset", "ISO-8859-1,utf-8"
       WinHttpReq.setRequestHeader "Content-Type", "multipart/form-data"
       ' WinHttpReq.setRequestHeader "Content-Type", "text/html;charset=UTF8"
       WinHttpReq.setRequestHeader "Content-Disposition", "form-data; name=""userfile[]"""

       ' I dont understand this... why use fileup??
       FormFields = """filename=" & StrFileName & """"
       FormFields = FormFields & "&"
       FormFields = FormFields & sfpath

       ' so comment it out for now
       ' WinHttpReq.Send FormFields
       WinHttpReq.Send sfpath & StrFileName

       ' output this var to a message box becuase I dont know what it does really
       MsgBox FormFields
       ' Display the status code and response headers.
       MsgBox WinHttpReq.GetAllResponseHeaders
       MsgBox WinHttpReq.ResponseText


End Sub

The message boxes at the bottom of the script do output the server’s headers and response (blank HTML page). I feel that there is something that I am not setting in the headers to make the server happy (note: trying commenting out Content-Type).

If anyone out there has experience using the WinHttpRequest object in VBA/6 to POST a binary file via HTTP, please help! :)

 

zanoza1989

Пользователь

Сообщений: 4
Регистрация: 20.09.2017

#1

20.09.2017 16:55:52

Есть задача выгружать данные в виде файлов с сайта, сайт геренит уникальный ID сессии для выгрузки данных файлов. Есть очень похожая тема и по сути она дает все ответы (

http://www.excelworld.ru/forum/10-19904-1

), но до ума довести не могу данный вопрос.

благодаря Средствам разработчика IE получил строку ПОСТ запроса, формата:

Код
{“параметр1”:”значение1”,“параметр2”:”значение2”,“параметр3”:null, “параметр4”:123456677}

на который приходит ответ с необходимым ID
Как ее корректно отправить, я не могу разобраться (

Все параметры .SetRequestHeader передаются (тоже взял из средств разработчика)
загвоздка на позиции .send (?)
ошибка:Runtime Error -2147012890 (80072 ee6); Automation error, при отработке данной строки

Подскажите пожалуйста где есть внятное описание как преобразовать полученный запрос и отправить его, что бы получить ответ )

 

Игорь

Пользователь

Сообщений: 3631
Регистрация: 23.12.2012

попробуйте сделать на основе этого кода, — может, получится

http://excelvba.ru/code/DownloadFileWithAuth

 

zanoza1989

Пользователь

Сообщений: 4
Регистрация: 20.09.2017

Игорь, Завтра попробую на работе, как я понял смыл сводится к тому что бы преобразовать запрос в Юникод:

   ‘ здесь перечисляем параметры авторизации в формате name1=value1&name2=value2&name3=value3
PostData = «mtklogin=MyLogin&mtkpass=MyPassword»
   POST = StrConv(PostData, vbFromUnicode)

Такого я не пробовал, но подумывал, что скорее всего кодировка запроса не устраивает «ту сторону» )
что касается формата передачи данных то такой вариант пробовался, результат — отрицательный(

мои мысли: с другой стороны  Средства разработчика IE тупо показывают  уже готовый текст запроса который был отправлен и он там читается, понятен и не кодирован, в чем подвох )  

 

Doober

Пользователь

Сообщений: 2204
Регистрация: 09.04.2013

Не кодировка , а скорее всего формат.
В Вашем примере это json

 

zanoza1989

Пользователь

Сообщений: 4
Регистрация: 20.09.2017

Doober, поподробнее можно?
да, формат именно json
как корректно отправит запрос в этом формате для меня пока неведомая загадка.
Буду признателен если подскажите или направите.

 

Все_просто

Пользователь

Сообщений: 1042
Регистрация: 10.06.2013

#6

20.09.2017 21:52:24

Цитата
zanoza1989 написал:
Средства разработчика IE

Не знаю как вы смотрели, но сделать все можно вполне обычным способом.
В хроме (как и в других браузерах, только в других браузерах в других местах может быть) в самом низу есть пункт Form Data. Вот там выбираете View Source и этот самый source копируете в текст payload’а.
Вот например текст для запоминания введенного текста на планете (view parsed в хроме):
autosave_id:21f6e6465711e8078a47bd3c1857d1550
form_data[PAGE_NAME]:read
form_data[FID]:1
form_data[TID]:96058
form_data[MID]:0
form_data[MESSAGE_TYPE]:REPLY
form_data[AUTHOR_ID]:
form_data[forum_post_action]:save
form_data[MESSAGE_MODE]:NORMAL
form_data[POST_MESSAGE]:
form_data[hidden_focus]:
form_data[USE_SMILES]:Y
form_data[TOPIC_SUBSCRIBE]:
form_data[send_button]:
form_data[view_button]:

А вот то же, только кодированное (без кавычек) — view source в хроме:

Скрытый текст

Изменено: Все_просто20.09.2017 21:58:38

С уважением,
Федор/Все_просто

 

Farafonov

Пользователь

Сообщений: 4
Регистрация: 26.10.2017

#7

26.10.2017 08:12:00

Здравствуйте, отправляю запрос post, копирую заголовки и тело запроса из firefox,  в ответе получаю ошибка 511 отказано в доступе. «{«error»:{«err_code»:511,»err_desc»:»Sign access denied»},»data»:null}», а лиса получает все данные

Код
Set HTTP = CreateObject("MSXML2.XMLHTTP")
'Set HTTP = CreateObject("WinHttp.WinHttpRequest.5.1")
sURL1 = "http://new.d64f23.olimpb24d.gdn/api/slice/"
'POST /api/slice/ HTTP/1.1
HTTP.Open "POST", sURL1, False
HTTP.SetRequestHeader "Host", "new.d64f23.olimpb24d.gdn"
'Host: new.3f21c8.olimpb24d.gdn
HTTP.SetRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 5.1; rv:52.0) Gecko/20100101 Firefox/52.0"
'User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:52.0) Gecko/20100101 Firefox/52.0
HTTP.SetRequestHeader "Accept", "*/*"
'Accept: */*
HTTP.SetRequestHeader "Accept-Language", "ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3"
'Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3
HTTP.SetRequestHeader "Accept -Encoding", "gzip , deflate"
'Accept -Encoding: gzip , deflate
HTTP.SetRequestHeader "X -Token", "def96c3189252fd655c41c9b62d47752"
'X -Token: def96c3189252fd655c41c9b62d47752
HTTP.SetRequestHeader "Content-Type", "application/json"
'Content-Type: application/json
HTTP.SetRequestHeader "Referer", "http://new.3f21c8.olimpb24d.gdn/?utm_medium=zerkalo&utm_source=emailbot"
'Referer: http://new.3f21c8.olimpb24d.gdn/?utm_medium=zerkalo&utm_source=emailbot
HTTP.SetRequestHeader "Content-Length", "63"
'Content-Length: 63
HTTP.SetRequestHeader "Cookie", "_ym_uid=1508951902624815638; _ga=GA1.4.1576018127.1508951902; _gid=GA1.4.619746481.1508951902; UKEY=240bc1a8-0953-4723-aadd-a87655e26b64; LNGID=0; LNG_ISO=ru; _ym_isad=2; __lc.visitor_id.g6897171_2.group2=S1506754199.942c6daab8; __lc.visitor_id.g6897171_2.group2=S1506754199.942c6daab8; _ym_visorc_43611274=w; lc_window_state.group2=minimized; lc_window_state.group2=minimized"
'Cookie: _ym_uid=1508951902624815638; _ga=GA1.4.1576018127.1508951902; _gid=GA1.4.619746481.1508951902; UKEY=240bc1a8-0953-4723-aadd-a87655e26b64; LNGID=0; LNG_ISO=ru; _ym_isad=2; __lc.visitor_id.g6897171_2.group2=S1506754199.942c6daab8; __lc.visitor_id.g6897171_2.group2=S1506754199.942c6daab8; _ym_visorc_43611274=w; lc_window_state.group2=minimized; lc_window_state.group2=minimized
HTTP.SetRequestHeader "Connection:", "keep -alive"
'Connection: keep -alive
MSG = "{" & Chr(34) & "live" & Chr(34) & ":" & Chr(34) & "1" & Chr(34) & "," & Chr(34) & "time_shift" & Chr(34) & ":0," & Chr(34) & "lang_id" & Chr(34) & ":" & Chr(34) & "0" & Chr(34) & "," & Chr(34) & "platforma" & Chr(34) & ":" & Chr(34) & "SITE_RU" & Chr(34) & "}"
HTTP.send MSG
otvet = HTTP.responseTex
 

Изменено: Farafonov26.10.2017 08:22:48

 

SuperCat

Пользователь

Сообщений: 2737
Регистрация: 21.12.2012

zanoza1989 и Farafonov,  — это один и тот же человек?
Быть может, лучше сделать запрос в C#? Там есть замечательная библиотека JSON.NET для работы с JSON.

There is no knowledge that is not power

 

Farafonov

Пользователь

Сообщений: 4
Регистрация: 26.10.2017

Нет это разные люди, спасибо сейчас погуглю, но всеже почему лиса получает ответ со всеми данными, а мне отказано, понятно что что-то не так, но в какую сторону искать.

 

zanoza1989

Пользователь

Сообщений: 4
Регистрация: 20.09.2017

Доброго времени суток, Мы разные, точно )
Свою проблему я решил простым методом научного тыка, помощью средств разработчика посмотрел какие параметры передаются в заголовке пост запроса и в самом запросе, скопировал всё это добро и начал исключать по очереди часть данных, и через н-ое количество раз — о чудо получил ответ.
Кстати нужно обязательно в сам запрос перекодировать в нужный язык который вы передаете  в заголовке.  

 

Farafonov

Пользователь

Сообщений: 4
Регистрация: 26.10.2017

Я сравнил запросы Fiddler Web Debugger, оказалось, что мои запросы отличаются от запросов Firefox наличием Cookies, их просто нет, сейчас бьюсь над тем как их добавить, отправляю запрос вручную и все получается.

 

Farafonov

Пользователь

Сообщений: 4
Регистрация: 26.10.2017

#12

27.10.2017 05:58:52

Вообщем если кому интересно или возможно пригодится исследователям в будущем. Сам запрос POST  я брал из отладчика Firefox F12, там в закладке сеть можно посмотрть все запросы и ответы сервера. Есть еще возможность «измнить и отправить», отуда я взял все заголовки и тело запроса. Далее ничего не получалось и я использовал Fiddler Web Debugger для сравнения моего и лисиного запроса, оказалось что мое приложение не отправляет часть заголовков, добавилась еще ночь гугленияи перебора вариантов, в итоге, что со мной уже не в первый раз, нужно было удалить лишние побелы и двоеточие. Добавляю код для ознакомления URL обновляется раз в сутки поэтому данный конкретный приме работать не будет нужно буде подставить свои параметры запроса.

Код
Set HTTP = CreateObject("MSXML2.XMLHTTP")
sURL1 = "http://new.7b4c5a.olimp9b55.gdn/api/slice/"
HTTP.Open "POST", sURL1, False
HTTP.SetRequestHeader "Host", "new.7b4c5a.olimp9b55.gdn"
HTTP.SetRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 5.1; rv:52.0) Gecko/20100101 Firefox/52.0"
HTTP.SetRequestHeader "Accept", "*/*"
HTTP.SetRequestHeader "Accept-Language", "ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3"
HTTP.SetRequestHeader "Accept-Encoding", "gzip , deflate"
HTTP.SetRequestHeader "X-Token", "def96c3189252fd655c41c9b62d47752"
HTTP.SetRequestHeader "Content-Type", "application/json"
HTTP.SetRequestHeader "Referer", " http://new.7b4c5a.olimp9b55.gdn/?utm_medium=zerkalo&utm_source=emailbot"
HTTP.SetRequestHeader "Content-Length", "63"
HTTP.SetRequestHeader "Cookie", "__ga=GA1.4.456166197.1509038006; _gid=GA1.4.1925683772.1509038006; _ym_uid=1509038006108342172; _ym_isad=2; UKEY=9c7ff6ba-ec7d-4cf5-a201-b37739b9ef4b; LNGID=0; LNG_ISO=ru; _ym_visorc_43611274=w; __lc.visitor_id.g6897171_2.group2=S1506754199.942c6daab8; __lc.visitor_id.g6897171_2.group2=S1506754199.942c6daab8; lc_window_state.group2=minimized; lc_window_state.group2=minimizedrn"
HTTP.SetRequestHeader "Connection", "keep-alive"
MSG = "{" & Chr(34) & "live" & Chr(34) & ":" & Chr(34) & "1" & Chr(34) & "," & Chr(34) & "time_shift" & Chr(34) & ":0," & Chr(34) & "lang_id" & Chr(34) & ":" & Chr(34) & "0" & Chr(34) & "," & Chr(34) & "platforma" & Chr(34) & ":" & Chr(34) & "SITE_RU" & Chr(34) & "}"
HTTP.send MSG
otvet = HTTP.responseText

Понравилась статья? Поделить с друзьями:
  • Vba excel метод inputbox
  • Vba excel метод find использование
  • Vba excel математические функции
  • Vba excel массивы ячеек
  • Vba excel массивы циклы