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.
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 |
#1 20.09.2017 16:55:52 Есть задача выгружать данные в виде файлов с сайта, сайт геренит уникальный ID сессии для выгрузки данных файлов. Есть очень похожая тема и по сути она дает все ответы ( http://www.excelworld.ru/forum/10-19904-1 ), но до ума довести не могу данный вопрос. благодаря Средствам разработчика IE получил строку ПОСТ запроса, формата:
на который приходит ответ с необходимым ID Все параметры .SetRequestHeader передаются (тоже взял из средств разработчика) Подскажите пожалуйста где есть внятное описание как преобразовать полученный запрос и отправить его, что бы получить ответ ) |
||
Игорь Пользователь Сообщений: 3631 |
попробуйте сделать на основе этого кода, — может, получится http://excelvba.ru/code/DownloadFileWithAuth |
zanoza1989 Пользователь Сообщений: 4 |
Игорь, Завтра попробую на работе, как я понял смыл сводится к тому что бы преобразовать запрос в Юникод: ‘ здесь перечисляем параметры авторизации в формате name1=value1&name2=value2&name3=value3 Такого я не пробовал, но подумывал, что скорее всего кодировка запроса не устраивает «ту сторону» ) мои мысли: с другой стороны Средства разработчика IE тупо показывают уже готовый текст запроса который был отправлен и он там читается, понятен и не кодирован, в чем подвох ) |
Doober Пользователь Сообщений: 2204 |
Не кодировка , а скорее всего формат. |
zanoza1989 Пользователь Сообщений: 4 |
Doober, поподробнее можно? |
Все_просто Пользователь Сообщений: 1042 |
#6 20.09.2017 21:52:24
Не знаю как вы смотрели, но сделать все можно вполне обычным способом. А вот то же, только кодированное (без кавычек) — view source в хроме:
Изменено: Все_просто — 20.09.2017 21:58:38 С уважением, |
|||
Farafonov Пользователь Сообщений: 4 |
#7 26.10.2017 08:12:00 Здравствуйте, отправляю запрос post, копирую заголовки и тело запроса из firefox, в ответе получаю ошибка 511 отказано в доступе. «{«error»:{«err_code»:511,»err_desc»:»Sign access denied»},»data»:null}», а лиса получает все данные
Изменено: Farafonov — 26.10.2017 08:22:48 |
||
SuperCat Пользователь Сообщений: 2737 |
zanoza1989 и Farafonov, — это один и тот же человек? There is no knowledge that is not power |
Farafonov Пользователь Сообщений: 4 |
Нет это разные люди, спасибо сейчас погуглю, но всеже почему лиса получает ответ со всеми данными, а мне отказано, понятно что что-то не так, но в какую сторону искать. |
zanoza1989 Пользователь Сообщений: 4 |
Доброго времени суток, Мы разные, точно ) |
Farafonov Пользователь Сообщений: 4 |
Я сравнил запросы Fiddler Web Debugger, оказалось, что мои запросы отличаются от запросов Firefox наличием Cookies, их просто нет, сейчас бьюсь над тем как их добавить, отправляю запрос вручную и все получается. |
Farafonov Пользователь Сообщений: 4 |
#12 27.10.2017 05:58:52 Вообщем если кому интересно или возможно пригодится исследователям в будущем. Сам запрос POST я брал из отладчика Firefox F12, там в закладке сеть можно посмотрть все запросы и ответы сервера. Есть еще возможность «измнить и отправить», отуда я взял все заголовки и тело запроса. Далее ничего не получалось и я использовал Fiddler Web Debugger для сравнения моего и лисиного запроса, оказалось что мое приложение не отправляет часть заголовков, добавилась еще ночь гугленияи перебора вариантов, в итоге, что со мной уже не в первый раз, нужно было удалить лишние побелы и двоеточие. Добавляю код для ознакомления URL обновляется раз в сутки поэтому данный конкретный приме работать не будет нужно буде подставить свои параметры запроса.
|
||