5

これがうまくいかない理由に困惑しているので、問題が見つからないようです。

これがコードです。

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:multipart / form-data; border = speed..Content-Length:233..Accept:/ ..Host:poster.example.com..Connection:Keep-Alive ....-- speed..Content-Dispostion:form-data; name = "function" .... balance ..-- speed..Content-Dispostion:form-data; name = "username" .... blah ..-- speed..Content-Dispostion:form-data; name = "password" .... blah..--speed--.。

応答は空です

HTTP / 1.1 200 OK..日付:2010年10月7日木曜日20:31:20 GMT..サーバー:Apache..Content-Length:0..Connection:close..Content-Type:text / html; charset =UTF-8...。

PS> [送信]の値が付いた送信ボタンを送信する必要はないので、誰かが疑問に思っている場合は送信しないでください。スニッフィングで気付いたのは、ヘッダーと投稿データ(アップロードデータ)を1つのパケットとして送信し、Firefox/Chromeが2つの個別のパケットとして送信することです。

ありがとうございました

4

1 に答える 1

7

スペルミスのあるContent-DispostionContent-Dispositionである必要があります。これは、私が6年間苦しんでいるおかげですか?多分7時間。

最終的に解決しました

于 2010-10-07T23:17:13.417 に答える