发布方法 + WinHttpRequest +多部分/表单数据
我很困惑为什么这不起作用似乎找不到任何问题。
这是代码。
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)。
<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..用户代理: 阿拉拉拉..内容类型: 多部分/表单数据; 边界=速度..内容长度: 233..接受:/..主机:poster.example.com..连接: Keep-Alive...--speed..Content-Dispostion:表单数据; 名称=“功能”....平衡..--速度..内容处置: 表单数据; 名称=“用户名”....blah..--速度..内容处置: 表单数据; 名称=“密码”....blah..--速度--..
响应为空
HTTP/1.1 200 OK..日期:10 月 7 日星期四 2010 20:31:20 GMT..服务器: Apache..内容长度:0..连接: 关闭..内容类型:text/html; 字符集=UTF-8......
PS>具有“发送”值的提交按钮不必发送,因此如果有人想知道,那就不是它。 我从嗅探中注意到它可能是什么,它将标头+发布数据(上传数据)作为一个数据包发送,而 firefox/chrome 将其作为 2 个单独的数据包发送。
谢谢
I'm stumped why this doesn't work can't seem to find any problems.
Here is the code.
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
Now this below works (although it's just a HTML FORM).
<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>
Here is a packet sniff. (Altered the host etc to example after)
POST / HTTP/1.1..User-Agent:
Alalala..Content-Type:
multipart/form-data;
boundary=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--..
response is empty
HTTP/1.1 200 OK..Date: Thu, 07 Oct
2010 20:31:20 GMT..Server:
Apache..Content-Length: 0..Connection:
close..Content-Type: text/html;
charset=UTF-8....
P.S.> The submit button with value Send doesn't have to be sent so thats not it if anyone is wondering.
What it could be and i've noticed from sniffing is that it sends the header + post data (upload data) as one packet and firefox/chrome sends it as 2 seperate packets.
Thank you
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
拼写错误的 Content-Disposition 必须是 Content-Disposition 是的,因为我已经受了 6 年的苦了?也许7个小时。
终于解决了
Mis-spelled Content-Dispostion has to be Content-Disposition yup thanks to that i've been suffering for 6? maybe 7 hours.
solved finally