2014-12-08 7 views
0

Я могу сделать GET с легкостью, вызвав следующий код:Как создать почтовый вызов с помощью Excel VBA?

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, как правило, ожидают, что имя пользователя и пароль, которые передаются в качестве параметров. Поскольку я не думаю, что могу передать 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.

Последнее, что я пробовал, состоял в простой загрузке, которая регистрирует пользователя и возвращает файл 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") 

... и т.д..


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

Любые идеи?

ответ

0

Сайт использует вход на основе файлов cookie. Таким образом, вам нужно войти в систему с помощью GET, забрать возвращенный файл cookie, а затем включить тот же файл cookie в заголовки запроса POST.

+0

Спасибо Том за помощь. Я попробовал это, и он, похоже, не работал. Я пробовал использовать код: Dim theLoginRequest, thePostRequest Установить theLoginRequest = CreateObject («WinHttp.WinHttpRequest.5.1») theLoginRequest.Open «GET», «http: // localhost/myapp/api?действие = Логин и пользователь = MyUser и передать = myPass " theLoginRequest.Send Set thePostRequest = CreateObject ("WinHttp.WinHttpRequest.5.1") thePostRequest.Open" POST "<сообщение запроса>" Ложное thePostRequest.setRequestHeader "Cookie", theLoginRequest.getResponseHeader («Set-Cookie») ... и т. д. Результат = аналогично прохождению параметров входа в URL. –

+0

Wow - нет комментариев в комментариях, ОК. Я добавлю его на свой основной пост для удобочитаемости. –

 Смежные вопросы

  • Нет связанных вопросов^_^