Jo: Multipart-Attachments an Rest Schnittstelle

Hallo,

ich muss in einem Projekt (PHP 5 mit PostgreSQL) meine Daten an eine Rest-Schnittstelle senden und zwar via Multipart-Attachments mit einem HTTP-Request.
Da wären zunächst einzelne Datensätze aus meiner DB die als JSON-Objekt geliefert werden müssen und dann noch je Datensatz ein Foto.

Ich habe sowas noch nie gemacht, wenn ich zum Thema google beziehen sich die Beispiele immer auf E-Mails mit Anhängen.
Gibt es für solche Zwecke bereits fertige Extensions oder Klassen oder wie kann ich am schnellsten die Aufgabe erledigen?

Danke
Jo

  1. hi,

    Ich habe sowas noch nie gemacht, wenn ich zum Thema google beziehen sich die Beispiele immer auf E-Mails mit Anhängen.

    Dann machst Du es das Erstemal ;-)

    Schau Dir den MIME Standard an, eine eMail mit Anhängen, die Header, die Boundary und die Komponenten einer solchen Multipart-Message. Dann guck Dir eine HTTP-Message an mit dem Enctype="multipart/form-data" (POST), die ist ganz ähnlich aufgebaut wie eine Mail mit Anhängen, es gibt header, boundaries zum Trennen der Komponenten und die Komponenten selbst, in multipart/form-data ist jedoch ein .gif nicht base64-encoded, da steht die binary im Messagebody.

    Wen Du praktisch veranlagt bist, baue ein HTML-Formular (enctype="multipart/form-data" method="POST") zum Versenden einer Nachricht mit einem oder mehreren Dateianhängen. Verarbeite das serverseitig jedoch nicht mit einem Parser, sondern lese STDIN und schreibe den Inhalt in eine Datei, die ist sehr anschaulich.

    Gibt es für solche Zwecke bereits fertige Extensions oder Klassen oder wie kann ich am schnellsten die Aufgabe erledigen?

    Recherche. Mach Dir die Aufgabe klar, insbesondere die clientseitigen Anforderungen (welcher Useragent, oder sonstige Clientsoftware...). Und überhaupt, für welchen Zweck das alles gedacht ist. Zur Rest-Schnittstelle findest Du schon Einiges.

    Hotti

    1. hi,

      Wen Du praktisch veranlagt bist, baue ein HTML-Formular (enctype="multipart/form-data" method="POST") zum Versenden einer Nachricht mit einem oder mehreren Dateianhängen. Verarbeite das serverseitig jedoch nicht mit einem Parser, sondern lese STDIN und schreibe den Inhalt in eine Datei, die ist sehr anschaulich.

      Nunja, die Response kann ja auch im Browser gezeigt werden: Zum Testen

      Ich lasse das Script mal ein Weilchen stehen, nimm ein kleines GIF zum Testen. Serverseitig wird nichts gespeichert.

      Hotti

      --
      UKW hat kurze Wellen, ein Sender ist in wenigen Minuten zusammengebaut.
      1. Hi hotti,

        danke für die Hinweise, habe inzwischen schon mal das was ich wegschicken möchte als mailscript vorbereitet, und das funktioniert + sieht so aus:

          
          
           $to="yourmail@myac.de";  
           $subject="Text mit Attachment";  
           $from = "mymail@myac.de";  
          
           $mime_boundary="==Multipart_Boundary_x".md5(mt_rand())."x";  
          
           $tmp_name = "bild.jpg";  
           $type = 'image/jpeg';  
           $name = $tmp_name;  
          
           $message = 'Das ist irgendein Text, der auch mal länger werden kann...';  
          
           if (file_exists($tmp_name)){  
                 $file = fopen($tmp_name,'rb');  
                 $data = fread($file,filesize($tmp_name));  
                 fclose($file);  
          
                 $data = chunk_split(base64_encode($data));  
          
              $headers = "From: $from\r\n" .  
                 "MIME-Version: 1.0\r\n" .  
                 "Content-Type: multipart/mixed;\r\n" .  
                 " boundary=\"{$mime_boundary}\"";  
          
              $message = "This is a multi-part message in MIME format.\n\n" .  
                 "--{$mime_boundary}\n" .  
                 "Content-Type: text/plain; charset=\"utf-8\"\n" .  
                 "Content-Transfer-Encoding: 7bit\n\n" .  
                 $message . "\n\n";  
          
              $message .= "--{$mime_boundary}\n" .  
                 "Content-Type: {$type};\n" .  
                 " name=\"{$name}\"\n" .  
                 "Content-Transfer-Encoding: base64\n\n" .  
                 $data . "\n\n" .  
                 "--{$mime_boundary}--\n";  
          
              if (@mail($to, $subject, $message, $headers))  
                 echo "Nachricht gesendet";  
              else  
                 echo "Fehler beim Senden";  
           }  
        
        

        Jetzt muß ich genau diese Daten auch an die Rest-Schnittstelle versenden, die einen HTTP Request erwartet. Wie kann ich das mit PHP-Bordmitteln erreichen ohne ein HTML-Formular (enctype="multipart/form-data" method="POST") bauen zu müssen?
        Danke
        Jo

        1. hi Jo,

          Erstmal schön dass die Mail funktioniert (den Code habe ich jedoch nicht geprüft).

          Jetzt muß ich genau diese Daten auch an die Rest-Schnittstelle versenden, die einen HTTP Request erwartet. Wie kann ich das mit PHP-Bordmitteln erreichen ohne ein HTML-Formular (enctype="multipart/form-data" method="POST") bauen zu müssen?

          PHP bietet eine Schnittstelle zu Sockets. Damit würde ich das machen, also damit einen UserAgent bauen. Im Prinzip baust Du erst ein Socket auf zum host (example.com), Protokoll 'TCP' und Port 80 (HTTP). Das Socket ist wie ein Dateihandle, da schreibst Du die Header rein und gefolgt von einer Leerzeile dann den Message-Body. Beispiel Header, Leerzeile, Body:

          POST /path/restschnittstelle HTTP/1.0
          Host: example.com
          Content-Length: 'muss stimmen: die Anzahl der Bytes vom body'
          Connection: close

          $Body

          Der Protokollversion HTTP/1.0 genügen diese header, ein transferencoding findet nicht statt, der Server antwortet 'am Stück' und schließt die Verbindung (Connection: close). Die Response samt response-Headers und Body kannst Du nach dem Senden aus dem Socket lesen.

          Möglicherweise hat PHP aber auch schon fertige Klassen zu bauen eines etwas komfortableren UserAgents, der macht im Prinzip dasselbe.

          Einen speziellen UA in Perl siehe hier.

          Hotti