Как создать http-вызов с помощью Excel VBA?

Я могу легко делать GET, вызывая следующий код:

Dim theURL As String, theRequest As Object
theURL = "http://localhost/myapp/encrypt.jsp?str=" & _
    encodeStr(range("I10").Value) & "&user=myUser&pass=myPass"
Set theRequest = CreateObject("WinHttp.WinHttpRequest.5.1")
theRequest.Open "GET", theURL 
theRequest.Send
MsgBox theRequest.ResponseText

Однако у меня значительно больше проблем с постом. HTML-код формы, которую я пытаюсь смоделировать:

<form method="post" enctype="multipart/form-data" action="managefile?operation=upload">
  <table>
    <tr>
        <h3 align="center">Upload File</h3>
    </tr>
    <tr>
        <td>File:</td>
        <td><input type="file" size="80" name="fname"></td>
        <td><input type="Submit" value="Upload"></td>
    </tr>
  </table>
</form>

API get обычно ожидают, что имя пользователя и пароль будут переданы в качестве параметров. Поскольку я не думаю, что смогу передать POST с параметрами, я попытался отправить сообщение с разделением данных по границам, используя методы, которые я нашел на разных страницах (в том числе здесь). Ни один из них не сработал.

Вот пример некоторого кода, который я пробовал, который не работал:

Dim theURL As String, theRequest As Object, theBody As String, theBoundary As String
theBoundary = "-----------------13850284693" ' Sample, generating from timestamp        
theBody = theBoundary & vbCrLf
theBody = theBody & "Content-Disposition: form-data" & vbCrLf & vbCrLf
theBody = theBody & "user=myUser&pass=MyPass" & vbCrLf ' I am wondering if this also needs to include action
theBody = theBody & theBoundary & vbCrLf
theBody = theBody & "Content-Disposition: form-data; name=""fname""; filename=""update.xml""" & vbCrLf
theBody = theBody & "Content-Type: text/xml" & vbCrLf & vbCrLf
theBody = theBody & "<MyXML><Node1>ff</Node1></MyXML>"
theBody = theBody & vbCrLf
theBody = theBody & theBoundary & "--" & vbCrLf

theURL = "http://localhost/myapp/managefile?operation=upload"
Set theRequest = CreateObject("WinHttp.WinHttpRequest.5.1")
theRequest.Open "POST", theURL, False
theRequest.setRequestHeader "Cache-Control", "no-cache"
theRequest.setRequestHeader "Content-Type", "multipart/form-data; boundary=" & theBoundary
theRequest.setRequestHeader "Content-Length", Len(theBody)    
theRequest.Send theBody

Страница, которую я возвращаю из этого примера, состоит в том, что я не вошел в систему, поэтому кажется, что она не передает мои параметры должным образом.

Я также попытался передать имя пользователя и пароль как часть URL, например

theURL = "http://localhost/myapp/managefile?operation=upload&user=myUser&pass=myPass"

И из этого я получаю ошибку, говоря, что это (API) ожидает

<MyXML>...</MyXML>

и это становится:

-----------------13850284693..(continues)..<MyXML><Node1>ff</Node1></MyXML>.

Это заставляет меня верить, что он входит в систему нормально, но не выполняет должным образом пост.

Я пытался сделать то же самое и просто отправить XML, но это тоже не сработало. Это не имеет смысла для меня, так как API не будет знать, с каким параметром связать XML.

Последнее, что я попробовал, было запустить простой метод get, который регистрирует пользователя и возвращает cookie, а затем передает его обратно. Это, похоже, делает то же самое, что и выше, все еще имеет проблему с POST.

Вот моя попытка установить cookie. Кажется, он работает так же, как и когда я передаю параметры - похоже, что вход в систему работает, но он не может правильно выполнить сообщение (в частности, xml, который я пытаюсь отправить):

Dim theLoginRequest, thePostRequest
Set theLoginRequest = CreateObject("WinHttp.WinHttpRequest.5.1")
theLoginRequest.Open "GET", "localhost/myapp/login?user=myUser&pass=myPass"
theLoginRequest.Send
Set thePostRequest = CreateObject("WinHttp.WinHttpRequest.5.1")
thePostRequest.Open "POST, "<post request>", False
thePostRequest.setRequestHeader "Cookie", theLoginRequest.getResponseHeader("Set-Cookie")

...так далее.


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

Есть идеи?

1 ответ

На сайте используется логин на основе файлов cookie. Поэтому вам нужно войти в систему с помощью GET, забрать возвращенный файл cookie, а затем включить этот же файл cookie в заголовки запроса POST.

Другие вопросы по тегам