[Version 4.1] HttpPostRequestLib

    • Release

    Es gibt 239 Antworten in diesem Thema. Der letzte Beitrag () ist von asusdk.

      [Version 4.1] HttpPostRequestLib

      Name des Programms:
      HttpPostRequestLib

      Beschreibung:
      Mit dieser Library lassen sich Variablen und Dateien via POST an ein Script schicken.
      Sie unterstützt deflate und gzip komprimierten Content. Zudem kann man einen Proxy angeben über den der Request geschickt wird.
      Im Beispiel unten ist dargestellt wie man GET, POST und FILES an das angegebene Script schickt.

      Die Funktionen GetLibVersion() und GetOSVersion() dienen dazu wenn man einen eigenen UserAgent String zusammen setzten möchte.

      Changelog:
      Version 2.1 - ProgressChanged Event hinzugefügt und die Methoden GetOSVersion() und GetLibVersion() als Shared deklariert.
      Version 2.2 - Streams gefixed, so dass sie nun nicht mehr hängen sollte wenn 2 Requests hintereinander gesendet werden.
      Version 2.3 - Proxy unterstürtzung eingefügt.
      Version 2.4 - Über die SubmitEventArgs lässt sich nun der Sourcecode und die Uri auslesen, ebenso direkt von der Request Instanz.
      Version 3.0 - Komplette umstrukturierung der Lib und hinzufügen neuer Funktionen womit sich nun auch ByteArrays hinzufügen lassen
      Version 3.1 - Optimierung der Library, so dass nun Ressourcen über Disposing wieder freigegeben werden können.
      Version 3.2 - Abbrechen des Uploadvorgangs
      Version 4.0 - Überarbeitung und optimierung des Codes und runterschrauben des .NET-Frameworks auf 2.0
      Version 4.1 - CookieCollection kann nun zwischen gespeichert und einem neuen Request wieder zugeordnet werden.

      Screenshot:
      - keiner -

      Anwendungs Beispiel:
      In diesem Beispiel gehe ich davon aus, das zuerst ein Login nötig ist um Daten hochzuladen, somit mache ich 2 Requests und speichere die Cookies.

      Beispiel VB Projekt

      VB.NET-Quellcode

      1. Imports HttpPostRequestLib.Net
      2. Public Class Form1
      3. Private WithEvents reg As HTTPPostRequest
      4. Private t1 As New Threading.Thread(AddressOf UploadFiles)
      5. Private Delegate Sub UpdateTextbox(ByVal Text As String)
      6. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      7. t1.Start()
      8. End Sub
      9. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
      10. reg.CancelSubmit = True
      11. End Sub
      12. Private Sub UploadFiles()
      13. Dim Sourcecode As String = String.Empty
      14. Dim Cookies As System.Net.CookieCollection
      15. ' Thread zurücksetzten damit er neu gestartet werden kann
      16. t1 = New Threading.Thread(AddressOf UploadFiles)
      17. ' Request erstellen für den Login
      18. reg = New HTTPPostRequest("http://localhost/vb/post.php?mode=login")
      19. 'reg.Proxy = New Proxy("http://www.proxy.com", 1432, "test", "password")
      20. Try
      21. ' POST Variablen hinzufügen
      22. reg.Post.Add("username", "Dodo")
      23. reg.Post.Add("passwd", "123")
      24. ' Request abschicken
      25. Sourcecode = reg.Submit()
      26. Catch ex As Exception
      27. MessageBox.Show(ex.Message)
      28. End Try
      29. ' Prüfen ob der Login erfolgreich war
      30. If Sourcecode.Contains("login ok") Then
      31. ' Cookies vom aktuellen Request zwischenspeichern
      32. Cookies = reg.Cookies
      33. ' neuen Request für den Upload erstellen
      34. reg = New HTTPPostRequest("http://localhost/vb/post.php?mode=upload")
      35. ' Cookies vom ersten Request zuweisen
      36. reg.Cookies = Cookies
      37. Try
      38. ' POST Variable hinzufügen
      39. reg.Post.Add("folder", "ordner")
      40. ' Dateien hinzufügen
      41. reg.Files.Add("file[]", "e:\bild.jpg")
      42. reg.Files.Add("file[]", "test.avi", System.IO.File.ReadAllBytes("e:\test.avi"), MimeTypes.Video.Avi)
      43. ' Request abschicken
      44. Sourcecode = reg.Submit()
      45. Catch ex As Exception
      46. MessageBox.Show(ex.Message)
      47. End Try
      48. End If
      49. ' In einer Textbox die Ausgaben des Scriptes ausgeben
      50. Me.Invoke(New UpdateTextbox(Function(Text As String) TextBox1.Text = Text), Sourcecode)
      51. End Sub
      52. Private Sub reg_SubmitComplete(ByVal sender As Object, ByVal e As SubmitEventArgs) Handles reg.SubmitComplete
      53. TextBox1.Text = e.Sourcecode
      54. End Sub
      55. Private Sub reg_ProgressChanged(ByVal sender As Object, ByVal e As ProgressEventArgs) Handles reg.ProgressChanged
      56. If Not e.TotalByte = 0 Then
      57. Dim prozent As Integer = CInt((e.UploadedByte / e.TotalByte) * 100)
      58. ProgressBar1.Value = prozent
      59. Label1.Text = prozent.ToString()
      60. End If
      61. End Sub
      62. Private Sub reg_SubmitCancel(ByVal sender As Object, ByVal e As EventArgs) Handles reg.SubmitCancel
      63. ' Meldung ausgeben wenn der Request abgebrochen wurde
      64. MessageBox.Show("Cancel Upload")
      65. reg.Dispose()
      66. End Sub
      67. End Class


      Beispiel PHP Script für Login & MultiUpload:

      post.php

      PHP-Quellcode

      1. <?php
      2. error_reporting(E_ALL);
      3. switch($_GET['mode']) {
      4. case "login":
      5. if($_POST['username'] == "Dodo" && $_POST['passwd'] == "123") {
      6. setcookie("login", "1", time() + 3600, "/");
      7. echo "login ok";
      8. } else {
      9. echo "login failed";
      10. }
      11. break;
      12. case "upload":
      13. if(count($_COOKIE) > 0) {
      14. if($_COOKIE['login'] == "1") {
      15. $folder = $_POST['folder'];
      16. if(!empty($folder) && !is_dir($folder)) mkdir($folder);
      17. if(count($_FILES) > 0) {
      18. if(is_array($_FILES['file']['tmp_name']) && count($_FILES['file']['tmp_name']) > 0) {
      19. foreach($_FILES['file']['tmp_name'] as $index => $dummy) {
      20. if(move_uploaded_file($_FILES['file']['tmp_name'][$index], $folder."/".$_FILES['file']['name'][$index])) {
      21. echo $_FILES['file']['name'][$index]." ok\r\n";
      22. } else {
      23. echo $_FILES['file']['name'][$index]. " failed\r\n";
      24. }
      25. }
      26. } else {
      27. if(move_uploaded_file($_FILES['file']['tmp_name'], $folder."/".$_FILES['file']['name'])) {
      28. echo $_FILES['file']['name']." ok\r\n";
      29. } else {
      30. echo $_FILES['file']['name']. " failed\r\n";
      31. }
      32. }
      33. } else {
      34. echo "no files to upload";
      35. }
      36. } else {
      37. echo "cookie exists but wrong value";
      38. }
      39. } else {
      40. echo "no cookies";
      41. }
      42. break;
      43. }
      44. ?>


      Verwendete Programmiersprache:
      Visual Basic 2008

      Systemanforderungen:
      .NET Framework 2.0

      Download:
      HttpPostRequestLib4.rar (18 KB / 53 KB)

      Lizenz/Weitergabe:
      Freeware

      Einkompilieren ist nicht erlaubt. Eine Nennung ist nicht nötig.

      ADMIN-EDIT: Einzig funktionierender Download hier: [Version 4.1] HttpPostRequestLib

      Dieser Beitrag wurde bereits 24 mal editiert, zuletzt von „Marcus Gräfe“ ()

      danke, eine nützliche sache.

      allerdings will das bei mir nicht so richtig funktionieren. die verbindung kriegt er hin aber es werden keine daten übertragen, hat jemand eine idee an was das liegen kann?

      edit lokal funktioniert es aber bei einem externen kommen die daten nicht an

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

      Eigentlich gar nichts O.o also kannst mal verushcen wenn ein normales Formular mit POST machst und es dann an die Seite schickst.
      Ist es eine eigene PHP Seite oder sin Upload Server? Weil dann könnte es daran liegen, das nach dem Referer geschaut wird, ob die Infos wirklich von dem Server alleine kommen, das nach dem UserAgent geschaut wird, ich nutze einen eigenen UserAgent, vielleicht wird der incht akzeptiert!

      Dodo schrieb:

      Eigentlich gar nichts O.o also kannst mal verushcen wenn ein normales Formular mit POST machst und es dann an die Seite schickst.
      Ist es eine eigene PHP Seite oder sin Upload Server? Weil dann könnte es daran liegen, das nach dem Referer geschaut wird, ob die Infos wirklich von dem Server alleine kommen, das nach dem UserAgent geschaut wird, ich nutze einen eigenen UserAgent, vielleicht wird der incht akzeptiert!
      hab jetzt mal direkt auf dem server in dem php script ein formular erstellt und das selbe auch auf nem anderen mit der action auf den problematischen server. dazu hab ich mir die systemvariable server ausgeben lassen, die einzigen unterschiede:

      aufruf von sich selbst


      [HTTP_REFERER] => server.com/vb/test.php
      [CONTENT_LENGTH] => 21
      [HTTP_ORIGIN] => server.com
      [CONTENT_TYPE] => application/x-www-form-urlencoded

      [REMOTE_PORT] => 62002
      [REQUEST_METHOD] => POST


      aufruf von aussen:


      [REMOTE_PORT] => 62002
      [HTTP_REFERER] => server2.com/vb/test.php

      [REMOTE_PORT] => 62001
      [REQUEST_METHOD] => GET
      Wofür steht das "file" bei

      VB.NET-Quellcode

      1. TextBox1.Text = myRequest.Create("http://localhost/vb/test.php", "file", "C:\IMG2353.jpg", myCollection)

      steht das für <input type="file" /> ?

      #EDIT
      Bekomme als Antwort nur
      bei picspider.net

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

      Nein für den Namen des Inputfeldes

      <input type="file" name="entenmann" />

      um in PHP auf die hochgeladene Datei zuzugreifen

      $_FILES['entenmann']['tmp_name'];

      über mein request zu senden

      HttpPostRequest.Create("sever.de/seite.php", "entenmann", "C:\datei.jpg")
      bekomme trotzdem nur "�" und bei 5 anderen imagehostern auch nur denn quelltext von der index.php er uploaded also nicht, auch wenn ich die daten aus dem header mit sende geht es nicht und auch wenn nur die daten gesendet werden geht es nicht.

      naja muss ich wohl weiter schauen
      Ich werde mal schauen, problem bei solchen ImageHostern ist, die arbeiten viel mit AJAX Scripten und wenn man was uploaded und dann kommt ein AJAX Script, wleches nach der Bildverarbeitung auf jenes verlinkt, bekommt der Requester das nicht mit, weil er nur den Quelltext zurück gibt und nicht auswertet, wie ein Browser, der ja das AJAX Script ausführt und somit dann nach abarbeitung weiter redirected.

      Edit: Wohlmöglich genau aus diesem Gund, damit man NUR über die Homepage machen kann, dmait man die Werbung sieht und so weiter!
      Hey, tolle DLL. gute Idee, bin gerade an Programmen, die genau mit POST und GET arbeiten und von daher könnte ich sowas super brauchen.

      Frage: Gibt es die Möglichkeit, diese DLL auch in VB6 zu nutzen oder funzt es ausschliesslich mit .NET?
      Chris' Weblog - Mein Blog rund um Vieles :D
      Hab die .dll als Verweis hinzugefügt. Allerdings sagt er bei:

      Quellcode

      1. Dim myRequest As Net.HTTPPostRequest = New Net.HTTPPostRequest
      2. Dim myCollection As Net.PostCollection = New Net.PostCollection

      Das er HTTPPostRequest und PostCollection nicht kennt. Muss ich davor noch etwas machen bzw. ist es in vb 2008 anders?
      Hoffe mir kann jemand helfen.
      Nein du musst den noch Imports HTTPPostRequest ganz oben einfügen. Oder bei der deklaration mit angeben.

      VB.NET-Quellcode

      1. Dim myRequest As HTTPPostRequest.Net.HTTPPostRequest = New HTTPPostRequest.Net.HTTPPostRequest
      2. Dim myCollection As HTTPPostRequest.Net.PostCollection = New HTTPPostRequest.Net.PostCollection


      Aber damit das Übersichtlicher wird, kannst du Imports benutzen und somit braucht man nicht mehr den DLL Namen vorschreiben

      VB.NET-Quellcode

      1. Imports HTTPPostRequest
      2. '.... Klassen Deklaration
      3. Dim myRequest As Net.HTTPPostRequest = New Net.HTTPPostRequest
      4. Dim myCollection As Net.PostCollection = New Net.PostCollection


      oder

      VB.NET-Quellcode

      1. Imports HTTPPostRequest.NEt
      2. '.... Klassen Deklaration
      3. Dim myRequest As HTTPPostRequest = New HTTPPostRequest
      4. Dim myCollection As PostCollection = New PostCollection