【问题标题】:Post Method + WinHttpRequest + multipart/form-dataPost 方法 + WinHttpRequest + multipart/form-data
【发布时间】:2011-04-22 14:11:33
【问题描述】:

我很困惑为什么这不起作用似乎找不到任何问题。

这里是代码。

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..用户代理: Alalala..内容类型: 多部分/表单数据; 边界=速度..内容长度: 233..接受:/..主机:poster.example.com..连接: Keep-Alive....--speed..Content-Dispostion:表单数据; name="function"..balance..--speed..Content-Dispostion: 表格数据; name="username"..blah..--speed..Content-Dispostion: 表格数据; name="password"..blah..--速度--..

回复为空

HTTP/1.1 200 OK..日期:10 月 7 日,星期四 格林威治标准时间 2010 年 20:31:20..服务器: 阿帕奇..内容长度:0..连接: 关闭..内容类型:文本/html; charset=UTF-8....

P.S.> 带有值 Send 的提交按钮不必发送,所以如果有人想知道,那就不是它了。 它可能是什么,我从嗅探中注意到,它将标头 + 发布数据(上传数据)作为一个数据包发送,而 firefox/chrome 将其作为 2 个单独的数据包发送。

谢谢

【问题讨论】:

    标签: vb6 multipartform-data winhttprequest


    【解决方案1】:

    拼写错误的 Content-Disposition 必须是 Content-Disposition 是的,因为我已经痛苦了 6 年?大概 7 小时。

    终于解决了

    【讨论】:

      猜你喜欢
      • 2015-09-19
      • 1970-01-01
      • 2019-04-05
      • 2022-07-29
      • 1970-01-01
      • 2019-07-08
      • 1970-01-01
      • 2021-08-03
      • 1970-01-01
      相关资源
      最近更新 更多