2010-10-07 5 views
3

Je suis perplexe pourquoi cela ne fonctionne pas ne peut pas sembler trouver des problèmes.Post méthode + WinHttpRequest + multipart/form-data

Voici le 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 

Maintenant, cela fonctionne ci-dessous (bien que ce soit juste un formulaire 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> 

Voici un reniflage de paquet. (Altered l'hôte à l'exemple etc après)

POST/HTTP/1.1..User-Agent: Alalala..Content-Type: multipart/form-data; limite = vitesse..Contenu-Longueur: 233..Accepter: / ..Hôte: poster.example.com..Connexion: Keep-Alive ....-- vitesse..Content-Dispostion: formulaire -Les données; nom = "fonction" .... balance ..-- vitesse..Content-Dispostion: données de forme; nom = "nom d'utilisateur" .... blah ..-- vitesse..Content-Dispostion: formulaire-données; name = "mot de passe" .... bla .. ..-- speed--

réponse

est vide

HTTP/1.1 200 OK..Date: Jeu 7 octobre 2010 20:31:20 GMT..Serveur: Apache..Contenu-Length: 0..Connexion: close..Content-Type: text/html; charset = UTF-8 ....

post-scriptum> Le bouton Envoyer à la valeur Envoyer ne doit pas être envoyé si thats pas si quelqu'un se demande. Ce que cela pourrait être et ce que j'ai remarqué de sniffing, c'est qu'il envoie l'en-tête + post-données (upload data) comme un paquet et firefox/chrome l'envoie comme 2 paquets séparés.

Merci

Répondre

5

mal orthographié Content-dispostion doit être Content-Disposition yup grâce à ce que je souffre pour 6? peut-être 7 heures.

résolu finalement

Questions connexes