2009-05-21 4 views
4

Я использую макрос в Outlook, VBA для отправки файла в URL с помощью POST:Как сделать запрос POST на страницу, которая может перенаправить на страницу входа

Set http = New WinHttp.WinHttpRequest 
http.Open "POST", UrlToPostTo, False 'True           ' 
http.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" 
http.setRequestHeader "Content-Type", "multipart/form-data; " 
http.Send data 

Моя проблема страница, будет принимать запрос (в этом случае страница загрузки файлов) защищена аутентификацией - первоначальный запрос для нее выше вернет страницу входа, а не сама страница.

Я попытался определить, появляется ли страница входа в систему, и если да, укажите имя пользователя и пароль как переменные формы (я надеюсь, что это эквивалентно тому, что человек вводит имя пользователя и пароль на страницу в веб-браузере) ,

Итак, шаги:
* URL-адрес запроса (включая файл с сообщением).
* Проверьте, является ли ответом страница входа.
* Если это так, то в том же сеансе http укажите имя пользователя и пароль для URL-адреса.
* Если сервер теперь обрабатывает исходное сообщение, хорошо, в противном случае я могу опубликовать его снова.

код выглядит следующим образом:

' if the login page comes back, send credentials          ' 
If (InStr(http.ResponseText, "j_password") > 0) Then 

    Dim loginData As String 
    loginData = "j_username=theusername&j_password=thepassword" 

    http.Open "POST", UrlToPostTo, False 
    http.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" 
    http.setRequestHeader "Content-Type", "multipart/form-data; " 
    http.Send loginData 
End If 

Но когда я делаю это, http.Responsetext только страница Войти по-прежнему (или снова?).

Любая идея, что я делаю неправильно? Является ли мой план действительным?

(Это связано с попыткой решить this problem)

ответ

0

ли страница входа в тот же URL, как страницы, которую первоначально представлен? Я не вижу никакого кода, который изменяет urlToPostTo

После вашего первого отправления вы можете посмотреть имущество Status по вашему запросу. См. the RFC, что означает каждый код состояния. Это также может помочь использовать метод GetAllResponseHeaders, чтобы точно определить, что происходит. См. MSDN для получения более подробной информации.

+0

страница входа URL тот же - я прошу оригинальную страницу и служит исходную страницу, если я уже идентифицирован, или страница Войти в противном случае , Я не перенаправляюсь, URL-адрес в браузере не изменяется, когда вы делаете это вручную. – MGOwen

+0

@barrowc, спасибо, я попробую проверить статус и заголовки, как было предложено. – MGOwen

0

Возможно, вы сможете сохранить имя пользователя и пароль в файлах cookie, которые позволят вам напрямую получить доступ к вашей странице.

Dim doc As WinHttp.WinHttpRequest 
    Set doc = New WinHttpRequest 

    doc.Open "POST", url, False 

    doc.SetRequestHeader "Cookie", "UserID=" & username 
    doc.SetRequestHeader "Cookie", "Password=" & password 

Вам необходимо подтвердить имена переменных на вашем сервере. Вы можете использовать такой инструмент, как ieHTTPHeaders, чтобы проверить заголовки при доступе к странице из браузера, чтобы узнать, что вам нужно сделать.

6

Я знаю, что эта нить древнее и я понимаю, что OP определенно перешли давно. Я просто потратил большую часть 3 вечеров, которые были смирены этой же проблемой, и эта тема продолжалась, когда я прекратил исследовать больше, поэтому я думал, что внес свой вклад в следующий парень, который приходит.

Хитрость заключается в том:

  • Отключить переадресацию с помощью использования Option свойства, чтобы остановить его от двигаться дальше без вас. (см. комментарии ниже)
  • Захват перенаправления на выходе Status и ручка оттуда.

Я уверен, что есть другие способы, но это показалось мне довольно элегантным, и я нашел много других способов его использования.

Чтобы использовать пример кода OPs, вы можете сделать свой запрос, как планировалось, за одним исключением: EnableRedirects var, который должен появиться после открытия соединения (не читал нигде, просто не мог заставить его придерживаться закрытое соединение).

Удача "следующий парень"!

Dim http As WinHttp.WinHttpRequest 
    Dim UrlToPostTo As String, UrlRedirectedTo As String 

    'Your initial request (assuming lots here) 
    Set http = New WinHttp.WinHttpRequest 
    http.Open "POST", UrlToPostTo, False 
    'Stop it from redirecting automatically, so you can capture it 
    http.Option(WinHttpRequestOption_EnableRedirects) = False 'You can also use the collection index instead of the pretty name 
    http.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" 
    http.setRequestHeader "Content-Type", "multipart/form-data; " 
    http.Send 

    'Now if you have an active session, you should get your desired content 
    'If it redirected you, you'll have a different status, header etc...  

    If http.status = "302" Then 
     Dim loginData As String 
     'Now lets find out where we're being pointed and POST there 
     'This may not be the same url you see in your address bar 
     UrlRedirectedTo = http.GetResponseHeader("Location") 
     'Also, you may have to do this again to arrive back at the intended resource  
     loginData = "j_username=theusername&j_password=thepassword" 
     http.Open "POST", UrlRedirectedTo, False 
     http.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" 
     http.setRequestHeader "Content-Type", "multipart/form-data; " 
     http.Send loginData 
    End If 

Некоторая информация, которую я нашел полезной в лабиринте MSDN.

WinHttpRequest Options (MSDN)

WinHttpRequest Object (MSDN)

Cookie Handling WinHttp (MSDN)

+1

Спасибо, этот ответ был очень полезен, и он работал хорошо. – Santosh