Метод Post + WinHttpRequest + multipart / form-data - PullRequest
3 голосов
/ 08 октября 2010

Я озадачен, почему это не работает, не могу найти никаких проблем.

Вот код.

Public Const MULTIPART_BOUNDARY = "speed"
Function getBalance() As String
Dim sEntityBody As String
Dim postBody() As Byte
Dim username As String
Dim password As String

username = CStr(frmMain.txtUser.text)
password = CStr(frmMain.txtPass.text)

sEntityBody = "--" & MULTIPART_BOUNDARY & vbCrLf
sEntityBody = sEntityBody & "Content-Disposition: form-data; name=""function""" & vbCrLf & vbCrLf & "balance" & vbCrLf
sEntityBody = sEntityBody & "--" & MULTIPART_BOUNDARY & vbCrLf
sEntityBody = sEntityBody & "Content-Disposition: form-data; name=""username""" & vbCrLf & vbCrLf & username & vbCrLf
sEntityBody = sEntityBody & "--" & MULTIPART_BOUNDARY & vbCrLf
sEntityBody = sEntityBody & "Content-Disposition: form-data; name=""password""" & vbCrLf & vbCrLf & password & vbCrLf
sEntityBody = sEntityBody & "--" & MULTIPART_BOUNDARY & "--" & vbCrLf

postBody = StrConv(sEntityBody, vbFromUnicode)

Dim xhr As Object
Set xhr = CreateObject("WinHttp.WinHttpRequest.5.1")
xhr.Option(WinHttpRequestOption_EnableRedirects) = False
If xhr Is Nothing Then Set xhr = CreateObject("WinHttp.WinHttpRequest")
If xhr Is Nothing Then Set xhr = CreateObject("MSXML2.ServerXMLHTTP")
If xhr Is Nothing Then Set xhr = CreateObject("Microsoft.XMLHTTP")
xhr.open "POST", "http://poster.example.com", False

xhr.setRequestHeader "User-Agent", "Alalala"
xhr.setRequestHeader "Content-Type", "multipart/form-data; boundary=" & MULTIPART_BOUNDARY
xhr.setRequestHeader "Content-Length", Len(sEntityBody)
xhr.send "" + sEntityBody 'postBody 'URLEncode(sEntityBody)

    If xhr.Status = 200 Then
        getBalance = xhr.responseText
    Else
        frmMain.addToChatbox "Failed at getting response from blah ErrCode:" & xhr.Status
    End If
End Function

Теперь это работает ниже (хотя это всего лишь ФОРМА HTML).

<form 
 method="post" 
 action="http://poster.example.com/" 
 enctype="multipart/form-data">
 <input type="hidden" name="function" value="balance">
 <input type="text"   name="username" value="blah">
 <input type="text"   name="password" value="blah">
 <input type="submit" value="Send">
</form>

Вот пакетный анализатор. (Изменил хост и т. Д. В примере после)

POST / HTTP / 1.1..User-Agent: Alalala..Content-Type: многочастному / форм-данных; граница = speed..Content-Length: 233 .. Примите: / .. Хост: poster.example.com..Соединение: Keep-Alive ....-- скорость .. Содержание-распоряжение: данные формы; имя = "функция" .... баланс ..-- speed..Content-Dispostion: форм-данных; имя = "имя" .... бла ..-- speed..Content-Dispostion: форм-данных; имя = "пароль" .... бла ..-- скорость - ..

ответ пуст

HTTP / 1.1 200 OK. Дата: четверг, 07 октября 2010 20:31:20 GMT .. Сервер: Apache..Content-Length: 0..Соединение: close..Content-Type: text / html; кодировка = UTF-8 ....

P.S.> Не нужно отправлять кнопку «Отправить» со значением «Отправить», так что, если кому-то интересно, это не так. Что это может быть, и я заметил, что, прослушивая, это то, что он отправляет заголовок + отправлять данные (загружать данные) как один пакет, а firefox / chrome отправляет его как 2 отдельных пакета.

Спасибо

1 Ответ

6 голосов
/ 08 октября 2010

Неправильно написано Содержание-распоряжение должно быть Содержание-распоряжение Да, благодаря тому, что я страдаю 6?возможно 7 часов.

решено окончательно

...