HttpWebRequest POST - multipart/form-data Datei senden

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Sub7evenHH.

    HttpWebRequest POST - multipart/form-data Datei senden

    Hej zusammen!
    Ich versuche gerade einen HttpWebRequest auszuführen bei dem ich eine xml Datei mit sende.

    Bei Postman funktioniert der Request wunderbar wenn ich im Body "form-data" wähle als Key xmlRequest eingebe (ein anderer Name führt zum Fehler) und dann die xml Datei auswähle die ich senden möchte.
    Das heißt, ich muss es in vb dann irgendwie so hinbekommen, dass ich da den Body entsprechend benenne. Leider komme ich da absolut nicht weiter. Muss ich die XML Datei selber modifizieren? Oder kann man irgendwie einen Namen/Header mit senden?

    Hier mein Code:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Try
    3. #Region "Variables"
    4. Dim HTTP_Request As HttpWebRequest
    5. Dim HTTP_Response As WebResponse
    6. Dim HTTP_Method As String = "POST"
    7. Dim RequestPfad = "https://199.0.0.3/api"
    8. Dim boundary As String = "----------------------------------------AaB03x"
    9. Dim postfileHeader = boundary & vbCrLf & "Content-Disposition: form data; name = ""xmLRequest""; " &
    10. "filename= """ & "xmlRequest.xml" & """" & vbCrLf &
    11. "Content-Type: text/xml" & vbCrLf & vbCrLf
    12. #End Region
    13. #Region "Request - Certificates"
    14. ServicePointManager.ServerCertificateValidationCallback = New System.Net.Security.RemoteCertificateValidationCallback(AddressOf AcceptCert)
    15. ServicePointManager.Expect100Continue = True
    16. ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
    17. #End Region
    18. #Region "Request"
    19. HTTP_Request = WebRequest.Create(RequestPfad)
    20. HTTP_Request.Method = "POST"
    21. HTTP_Request.ContentType = "multipart/form-data"
    22. HTTP_Request.Accept = "text/xml"
    23. HTTP_Request.Headers.Add(HttpRequestHeader.Authorization, "Basic XXXX")
    24. #End Region
    25. #Region "POST"
    26. Dim stream As Stream = HTTP_Request.GetRequestStream()
    27. Dim parameters As String = System.IO.File.ReadAllText("xmlRequest.xml").ToString
    28. Dim buffer As Byte() = System.Text.Encoding.UTF8.GetBytes(parameters)
    29. stream.Write(buffer, 0, buffer.Length)
    30. #End Region
    31. #Region "Create File"
    32. Dim remoteStream As Stream
    33. Dim localStream As Stream
    34. Dim bytesRead As Integer
    35. Dim bytesProcessed As Integer = 0
    36. HTTP_Response = HTTP_Request.GetResponse()
    37. remoteStream = HTTP_Response.GetResponseStream()
    38. If Not System.IO.Directory.Exists(Application.CommonAppDataPath & "\test\") Then
    39. System.IO.Directory.CreateDirectory(Application.CommonAppDataPath & "\test\")
    40. End If
    41. localStream = File.Create(Application.CommonAppDataPath & "\test\" & "tempfile.tmp")
    42. Do
    43. bytesRead = remoteStream.Read(buffer, 0, buffer.Length)
    44. localStream.Write(buffer, 0, bytesRead)
    45. bytesProcessed += bytesRead
    46. Loop While bytesRead > 0
    47. localStream.Flush()
    48. localStream.Close()
    49. #End Region
    50. #Region "Response"
    51. Try
    52. HTTP_Response = HTTP_Request.GetResponse
    53. Dim StreamResponseRead As Stream = HTTP_Response.GetResponseStream
    54. Dim ResponseRead As StreamReader = New StreamReader(StreamResponseRead, Encoding.UTF8)
    55. Response_String = ResponseRead.ReadToEnd.ToString
    56. StreamResponseRead.Close()
    57. Catch ex As Net.WebException
    58. If ex.Response IsNot Nothing Then
    59. Dim sr As New StreamReader(ex.Response.GetResponseStream())
    60. MsgBox(sr.ReadToEnd.ToString)
    61. End If
    62. End Try
    63. #End Region
    64. MsgBox("OK")
    65. Catch ex As Exception
    66. MsgBox(ex.ToString)
    67. End Try
    68. End Sub


    Herzlichen Dank bereits jetzt :)
    @Sub7evenHH Poste mal eine solche XML-Datei.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Das ist der Inhalt der xml Datei

    Kann man in der Datei direkt noch Parameter wie den Namen hinzufügen? Es muss nicht zwingend die Datei sein die gesendet werden soll. Wichtig ist nur, dass der Server anscheinend nur die xml mit dem Namen xmlRequest akzeptiert.

    XML-Quellcode

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <request>
    3. <export-report>
    4. <report mode="original"/>
    5. <search path="report.uuid" value="111-a2222-333-444-5555" operator="like" datatype="string" conjunction="true" />
    6. <pdf-options pdfLanguage="en_US" embedBarcode="false" embedVerificationPercentage="false" type="albus_standard"/>
    7. </export-report>
    8. </request>

    Sub7evenHH schrieb:

    dass der Server anscheinend nur die xml mit dem Namen xmlRequest akzeptiert.
    Das lässt sich in Deinem Code nicht nach vollziehen.
    Die Variable postfileHeader wird nicht verwendet, der Dateiname wird sonst nicht verwendet.
    Was Du sonst noch für Parameter in die XML-Datei packst, hängt wohl eher vom Empfänger ab.
    Was erwartet der von Dir?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich habe den Code jetzt nochmal geändert und die XML angepasst.
    Leider erhalte ich wieder den Fehler wie wenn der Name der Datei bei Postman nicht korrekt eingegeben ist.

    Code:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Try
    3. #Region "Variables"
    4. Dim Response_String As String = "{}"
    5. Dim HTTP_Request As HttpWebRequest
    6. Dim HTTP_Response As WebResponse
    7. Dim HTTP_Method As String = "POST"
    8. Dim RequestPfad = "https://199.0.0.4"
    9. #End Region
    10. #Region "Request - Certificates"
    11. ServicePointManager.ServerCertificateValidationCallback = New System.Net.Security.RemoteCertificateValidationCallback(AddressOf AcceptCert)
    12. ServicePointManager.Expect100Continue = True
    13. ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
    14. #End Region
    15. #Region "Request Settings"
    16. HTTP_Request = WebRequest.Create(RequestPfad)
    17. HTTP_Request.Method = "POST"
    18. HTTP_Request.ContentType = "multipart/form-data; boundary=X-INSOMNIA-BOUNDARY"
    19. HTTP_Request.Accept = "*/*"
    20. HTTP_Request.Headers.Add(HttpRequestHeader.Authorization, "Basic XXX")
    21. HTTP_Request.CookieContainer = New CookieContainer()
    22. #End Region
    23. #Region "Send POST"
    24. Dim stream As Stream = HTTP_Request.GetRequestStream()
    25. Dim myFile As String = System.IO.File.ReadAllText("xmlRequest.xml").ToString
    26. Dim buffer1 As Byte() = System.Text.Encoding.UTF8.GetBytes(myFile)
    27. stream.Write(buffer1, 0, buffer1.Length)
    28. #End Region
    29. #Region "Create File"
    30. #End Region
    31. #Region "Response"
    32. Try
    33. HTTP_Response = HTTP_Request.GetResponse
    34. Dim StreamResponseRead As Stream = HTTP_Response.GetResponseStream
    35. Dim ResponseRead As StreamReader = New StreamReader(StreamResponseRead, Encoding.UTF8)
    36. Response_String = ResponseRead.ReadToEnd.ToString
    37. StreamResponseRead.Close()
    38. Catch ex As Net.WebException
    39. If ex.Response IsNot Nothing Then
    40. Dim sr As New StreamReader(ex.Response.GetResponseStream())
    41. MsgBox("Fehler: " & sr.ReadToEnd.ToString)
    42. End If
    43. End Try
    44. #End Region
    45. MsgBox("fertig")
    46. Catch ex As Exception
    47. MsgBox(ex.ToString)
    48. End Try
    49. End Sub


    XML:

    XML-Quellcode

    1. --X-INSOMNIA-BOUNDARY
    2. Content-Disposition: form-data; name="xmlRequest"; filename="xmlRequest.xml"
    3. Content-Type: application/xml
    4. <?xml version="1.0" encoding="UTF-8"?>
    5. <request>
    6. <export-report>
    7. <report mode="original"/>
    8. <search path="report.uuid" value="XXX" operator="like" datatype="string" conjunction="true" />
    9. <pdf-options pdfLanguage="en_US" embedBarcode="false" embedVerificationPercentage="false" type="albus_standard"/>
    10. </export-report>
    11. </request>
    12. --X-INSOMNIA-BOUNDARY--

    Sub7evenHH schrieb:

    den Fehler
    Welchen?
    In welcher Zeile Deines Codes?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Sub7evenHH schrieb:

    Den Fehler erhalte ich auch ...
    Und wann nicht?
    Wo ist denn da eine Abhängigkeit des Sende-Inhalts vom Dateinamen?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich konnte es gerade selbst lösen.

    Ich habe folgenden Teil im Code geändert bzw. hinzugefügt:

    VB.NET-Quellcode

    1. ​ HTTP_Request.Headers.Add("Content-Disposition", "form-data; name=""xmlRequest""; filename=""xmlRequest.xml""")
    2. HTTP_Request.ContentType = "multipart/form-data; boundary=------------------------d74496d66958873e"


    Die XML habe ich entsprechend angepasst.

    Jetzt funktioniert es :) Trotzdem vielen Dank!