Post mit Boundary

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von vico255.

    Post mit Boundary

    Nabend,
    ich stehe vor einem neuen Problem. Möchte einen Post mit Request senden und der Post sieht so aus.

    VB.NET-Quellcode

    1. Content-Type: multipart/form-data; boundary=---------------------------6591715614925
    2. Content-Length: 8715
    3. -----------------------------6591715613925
    4. Content-Disposition: form-data; name="cb_anrede"
    5. -----------------------------6591715613925
    6. Content-Disposition: form-data; name="cb_titel"
    7. -----------------------------6591715613925
    8. Content-Disposition: form-data; name="firstname"
    9. test
    10. -----------------------------6591715613925
    11. Content-Disposition: form-data; name="lastname"
    12. test

    und so weiter. Ich möchte allerdings nur einen Wert im Formular speichern. Wie muss ich den Post schreiben?

    VB.NET-Quellcode

    1. Dim boundary As String = "---------------------------" & DateTime.Now.Ticks.ToString("x")
    2. Dim newLine As String = System.Environment.NewLine
    3. ]Dim postData As String = (boundary & newLine & "Content-Disposition: form-data; name=""gid[]""" & newLine & "20")

    So?


    LG und Danke
    In Arbeit...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „vico255“ ()

    Hat keiner eine Idee?

    VB.NET-Quellcode

    1. Dim containsFile As Boolean = False
    2. Dim request As HttpWebRequest = DirectCast(WebRequest.Create(LoginUrl), HttpWebRequest)
    3. request.CookieContainer = cc
    4. Dim boundary As String = "---------------------------" & DateTime.Now.Ticks.ToString '("x")
    5. request.Method = "POST"
    6. 'request.KeepAlive = True
    7. request.UserAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0"
    8. request.UserAgent = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
    9. 'request.Timeout = CInt("30000")
    10. 'request.Headers.Add("Accept-Language", "vb,en-us;q=0.7,en;q=0.3")
    11. request.ContentType = "multipart/form-data; boundary=" & boundary
    12. request.Credentials = System.Net.CredentialCache.DefaultCredentials
    13. 'request.PreAuthenticate = False
    14. Dim builder As New StringBuilder()
    15. builder.Append("--" & boundary)
    16. builder.Append(vbCrLf)
    17. builder.Append("Content-Disposition: form-data; name=""" & "gid[]" & """" & vbCrLf)
    18. builder.Append(vbCrLf)
    19. builder.Append("20")
    20. builder.Append(vbCrLf)
    21. Dim bytes As Byte()
    22. bytes = Encoding.UTF8.GetBytes(builder.ToString)
    23. request.ContentLength = bytes.Length
    24. Dim ReturnString As String = ""
    25. Using stream As Stream = request.GetRequestStream
    26. stream.Write(bytes, 0,bytes.Length)
    27. stream.Flush()
    28. stream.Close()
    29. Try
    30. Using response As HttpWebResponse = CType(request.GetResponse, HttpWebResponse)
    31. Label1.Text = CStr(response.StatusCode)
    32. Label1.ForeColor = Color.Green
    33. Using reader As StreamReader = New StreamReader(response.GetResponseStream)
    34. ReturnString = reader.ReadToEnd
    35. End Using
    36. End Using
    37. Catch ex As Exception
    38. ReturnString = "ERROR"
    39. End Try
    40. End Using


    Laut FF müsste ich auf den Post ein 303 bekommen. Allerdings immer nur ein 200 und ich denke das der Post nicht zu 100% stimmt
    In Arbeit...

    vico255 schrieb:

    "-----------------------------6591715613925"
    Sind einfach die CPU-Ticks.
    Das einzig wichtige ist, dass dieser String über den ganzen Request hinweg gleich ist.
    Oben definierst du ihn (boundary=...)
    Und unten verwendest du ihn als Delimiter für die Post-Paramter.
    Das kann nahezu jeder beliebige String sein (der mit "--" beginnt.
    Wichtig ist, dass die Kombination in den Post-Daten nirgends vorkommt.
    Wenn's dich genau interessiert kannst du das im RFC 1341 nachlesen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „petaod“ ()

    Moin @petaod

    VB.NET-Quellcode

    1. Dim request As HttpWebRequest = DirectCast(WebRequest.Create(LoginUrl), HttpWebRequest)
    2. request.AllowAutoRedirect = False
    3. request.Method = "POST"
    4. request.ContentType = "multipart/form-data; boundary=---------------------------6930121075938"
    5. request.CookieContainer = cc
    6. Dim builder As New StringBuilder()
    7. builder.Append("---------------------------6930121075938")
    8. builder.Append(vbCrLf)
    9. builder.Append("Content-Disposition: form-data; name=""" & "gid[]" & """" & vbCrLf)
    10. builder.Append(vbCrLf)
    11. builder.Append("20")
    12. builder.Append(vbCrLf)
    13. Dim data() As Byte = Encoding.UTF8.GetBytes(builder.ToString)
    14. request.ContentLength = data.Length
    15. Dim s As Stream = request.GetRequestStream
    16. s.Write(data, 0, data.Length)
    17. Dim res As HttpWebResponse = CType(request.GetResponse, HttpWebResponse)
    18. MsgBox(res.StatusCode)


    Verstehe ich das richtig das es eigentlich völlig egal ist was hinter "---" steht? Da es sich eh nur um eine Zufallszahl handelt?
    Es funktioniert leider immer noch nicht.
    Wo könnte das Problem denn noch sein? Ich habe jetzt 1 boundary nachgebaut. Oder muss ich immer alle senden? Das wäre dann so um die 80 Stück.

    Es ist bisher so das ich mich erfolgreich auf der Seite anmelde und dann die Formulardaten absenden möchte.

    LG
    In Arbeit...

    vico255 schrieb:

    Oder muss ich immer alle senden?
    Natürlich musst du zwischen allen POST-Parametern ein Boundary setzen.

    VB.NET-Quellcode

    1. Dim Boundary = "Test12345"
    2. Dim Delimiter = vbCrLf & "--" & Boundary & vbCrLf
    3. request.ContentType = "multipart/form-data; boundary=" & Boundary
    4. builder.Append Delimiter
    5. builder.Append("Content-Disposition: form-data; name=""Parameter1""" & vbCrLf & vbCrLf & "10" & Delimiter)
    6. builder.Append("Content-Disposition: form-data; name=""Parameter2""" & vbCrLf & vbCrLf & "20" & Delimiter)
    Und das für alle Parameter.

    Schau dir per HTTP-Trace an, was du wegschickst und was der Browser wegschickt.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hallo @petaod

    Das versende ich. Muss ich alle absenden oder reicht es wenn ich nur den einen, den ich wirklich ändern möchte.

    Es funktioniert leider immer noch nicht :(

    /edit Hab es geschafft :)
    Bilder
    • Unbenannt.PNG

      55,76 kB, 766×603, 138 mal angesehen
    In Arbeit...

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „vico255“ ()