meraner: Multipart formdata Curl

Hi, ich habe folgende Gegebenheit, die mir Probleme bereitet. Vielleicht kann mir jemand den richtigen Hinweis geben, ich probiere schon seit Stunden.

Es müssen XML-Daten via POST an ein PHP-Skript gesendet werden, eigentlich eine simple Angelegenheit. Zum Testen der Daten (inhaltlich) stellt der Anbieter ein HTML-Formular bereit, in dessen Textfeld man die XML-Daten einträgt. Ich poste hier mal das FORM

  
<form enctype="multipart/form-data" method="post" action="../path/to/some/phpfile.php">  
<textarea name="testField" id="testField">  
</textarea>  
<input name="ace" id="ace" type="submit" value="Send Form">  
</form>  

Man kann also in dieses Formular XML-Daten eingeben, absenden und sich das Ergebnis ansehen. Ist das XML fehlerhaft, wirft der Server eine entsprechende Meldung raus, ist es richtig, wird das mit einer Erfolgsmeldung quittiert. Das auf dem Server befindliche Skript funktioniert also fehlerfrei.

Nun muss ich allerdings die Daten nicht mit diesem Formular versenden, sondern mit PHP. Zuerst einmal irritiert mich dieses "multipart/form-data". Alle meine Versuche, mit CURL schlugen bisher fehl. Der Server meldet stets, kein XML erhalten zu haben ("No XML DATA FOUND").

Beispiel Curl:

  
curl_setopt($ch, CURLOPT_URL, $url);  
curl_setopt($ch, CURLOPT_POSTFIELDS, array('testField' => $xml));  
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);  
curl_setopt($ch, CURLOPT_ENCODING, "multipart/form-data");  
$result=curl_exec($ch);  
curl_close($ch);  
print_r($result);  

Das ist nur einer von unzähligen Versuchen, ich habe es mit file_get_contents (und entsprchendem Kontext) und Curl versucht. Ich habe sogar schon den Header exakt so aus HTTP-LiveHeaders rauskopiert, wie das Formular gesendet hat und dem Streamkontext übergeben. An einer korrupten XML-Struktur kann es auch nicht liegen, da dieser Fehler über das Formular entsprechend ausgewertet wird ("WRONG XML STRUCTURE").

Nur um Fragen vorzubeugen, $xml ist nicht leer, sondern ein String:

  
$xml = "<?xml version=\"1.0\" standalone=\"yes\"?><doc><id>434</id><test>yes</test></doc>";  

Wie gesagt irritiert mich auch dieses multipart/form-data im Formular, ich lade ja keine Dateien hoch... was soll das?

Help? Anyone?

  1. Hi,

    Nun muss ich allerdings die Daten nicht mit diesem Formular versenden, sondern mit PHP. Zuerst einmal irritiert mich dieses "multipart/form-data". Alle meine Versuche, mit CURL schlugen bisher fehl. Der Server meldet stets, kein XML erhalten zu haben ("No XML DATA FOUND").

    Beispiel Curl:

    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POSTFIELDS, array('testField' => $xml));
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_ENCODING, "multipart/form-data");
    $result=curl_exec($ch);
    curl_close($ch);
    print_r($result);

      
    Ich sehe kein CURLOPT\_POST. (Macht cURL automatisch einen POST-Request, wenn man POSTFIELDS angibt?)  
      
    CURLOPT\_ENCODING ist laut PHP-Manual etwas ganz anderes, als wofür du es offenbar hältst. multipart/form-data sollte aber automatisch verwendet werden, wenn du ein Array als CURLOPT\_POSTFIELDS set.  
      
    Hast du mal probiert, auch den Submit-Button des Beispielformulars mit als Parameter zu übermitteln? Ggf. wertet das Zielscript diesen ja aus.  
      
    MfG ChrisB  
      
    
    -- 
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
    
    1. Hallo

      Ich sehe kein CURLOPT_POST. (Macht cURL automatisch einen POST-Request, wenn man POSTFIELDS angibt?)

      Auch wenn ich CURLOPT_POST angebe (1), ändert sich leider nichts. Ich bin am Verzweifeln.

      CURLOPT_ENCODING ist laut PHP-Manual etwas ganz anderes, als wofür du es offenbar hältst. multipart/form-data sollte aber automatisch verwendet werden, wenn du ein Array als CURLOPT_POSTFIELDS set.

      Ich hatte es auch schon weggelassen, keine Änderung.

      Hast du mal probiert, auch den Submit-Button des Beispielformulars mit als Parameter zu übermitteln? Ggf. wertet das Zielscript diesen ja aus.

      Gerade mal versucht, leider ohne Erfolg.

      Danke für deine MÜhe!

      Meraner

  2. Hi!

    Hi, ich habe folgende Gegebenheit, die mir Probleme bereitet. Vielleicht kann mir jemand den richtigen Hinweis geben, ich probiere schon seit Stunden.

    Google: php curl post

    Klappt denn gar nichts von den Suchergebnissen?

    Nun muss ich allerdings die Daten nicht mit diesem Formular versenden, sondern mit PHP. Zuerst einmal irritiert mich dieses "multipart/form-data".

    Was irritiert dich daran? Die Suchergebnisse, wenn man die obige Suchwortliste um multipart/form-data erweitert?

    curl_setopt($ch, CURLOPT_ENCODING, "multipart/form-data");

    Ist das Laut PHP-Handbuch oder auch laut anderweitiger cURL-Dokumentation ein güliger Wert für diese Option?

    Das ist nur einer von unzähligen Versuchen, ich habe es mit file_get_contents (und entsprchendem Kontext) und Curl versucht. Ich habe sogar schon den Header exakt so aus HTTP-LiveHeaders rauskopiert, wie das Formular gesendet hat und dem Streamkontext übergeben. An einer korrupten XML-Struktur kann es auch nicht liegen, da dieser Fehler über das Formular entsprechend ausgewertet wird ("WRONG XML STRUCTURE").

    Du hast auch keine Beispiele gefunden, die Datei-Upload plus zusätzlichee Eingabefelder behandeln? Das Einfügen der Datei kannst du ja weglassen, aber zumindest die anderen Eingabefelder müssen wie beim Dateiupload gestaltet sein.

    Wie gesagt irritiert mich auch dieses multipart/form-data im Formular, ich lade ja keine Dateien hoch... was soll das?

    Der Autor der Serverseite hat aber vielleicht den Fall so vorgesehen. Wie verhält sich eigentlich der Server, wenn du dein Test-Formular mit application/x-www-form-urlencoded sendest?

    Lo!

    1. Hi!

      Hi, ich habe folgende Gegebenheit, die mir Probleme bereitet. Vielleicht kann mir jemand den richtigen Hinweis geben, ich probiere schon seit Stunden.

      Google: php curl post

      Klappt denn gar nichts von den Suchergebnissen?

      Habe ich schon alles durch. Ich hatte auch noch nie Probleme damit, so schwer ist das ja nicht.

      Nun muss ich allerdings die Daten nicht mit diesem Formular versenden, sondern mit PHP. Zuerst einmal irritiert mich dieses "multipart/form-data".

      Was irritiert dich daran? Die Suchergebnisse, wenn man die obige Suchwortliste um multipart/form-data erweitert?

      Mich irritiert, dass diese Angabe doch nur angegeben wird, wenn man eine Datei hochlädt. Zumindest dachte ich das immer....

      curl_setopt($ch, CURLOPT_ENCODING, "multipart/form-data");

      Ist das Laut PHP-Handbuch oder auch laut anderweitiger cURL-Dokumentation ein güliger Wert für diese Option?

      Das war aus der Suchergebnisliste... Aber wie chrisB shcon sagte, nimmt Curl ja automatisch multipart/form-data wenn ein Array an Curl übergeben wird?

      Das ist nur einer von unzähligen Versuchen, ich habe es mit file_get_contents (und entsprchendem Kontext) und Curl versucht. Ich habe sogar schon den Header exakt so aus HTTP-LiveHeaders rauskopiert, wie das Formular gesendet hat und dem Streamkontext übergeben. An einer korrupten XML-Struktur kann es auch nicht liegen, da dieser Fehler über das Formular entsprechend ausgewertet wird ("WRONG XML STRUCTURE").

      Du hast auch keine Beispiele gefunden, die Datei-Upload plus zusätzlichee Eingabefelder behandeln? Das Einfügen der Datei kannst du ja weglassen, aber zumindest die anderen Eingabefelder müssen wie beim Dateiupload gestaltet sein.

      Doch, unzählige habe ich gefunden. Nur leider funktioniert halt keiner.

      Wie gesagt irritiert mich auch dieses multipart/form-data im Formular, ich lade ja keine Dateien hoch... was soll das?

      Der Autor der Serverseite hat aber vielleicht den Fall so vorgesehen. Wie verhält sich eigentlich der Server, wenn du dein Test-Formular mit application/x-www-form-urlencoded sendest?

      Das probiere ich mal aus, ich gebe Feedback. Danke soweit!

      Meraner

    2. Hi,

      Wie verhält sich eigentlich der Server, wenn du dein Test-Formular mit application/x-www-form-urlencoded sendest?

      Funktioniert ebenso...

      1. Hi!

        Wie verhält sich eigentlich der Server, wenn du dein Test-Formular mit application/x-www-form-urlencoded sendest?
        Funktioniert ebenso...

        Na dann, sollten doch auch eigentlich auch die einfachen cURL-POST-Beispiel klappen.

        Lo!

        1. Hi,

          Wie verhält sich eigentlich der Server, wenn du dein Test-Formular mit application/x-www-form-urlencoded sendest?
          Funktioniert ebenso...

          Na dann, sollten doch auch eigentlich auch die einfachen cURL-POST-Beispiel klappen.

          das dachte ich ja auch, aber es funktioniert nicht. Weder mit PHPs curl, weder mit Curl auf der Kommandozeile, weder mit wget.

          wget --post-data 'tgp=<data>ddd</data>' http://example.com/path/to/phpfile.php (*)

          wget --post-data 'tgp=xxx' http://example.com/path/to/phpfile.php (*)

          Antwort: "Could not load XML"

          simple Sachen doch eigentlich..? Warum geht das nicht? Vedammt, ich geb's auf.

          Danke nochmal!

          Meraner

          * Formular gibt hier wenigstens "WRONG XML STRUCTURE" aus

          1. Hi!

            wget --post-data 'tgp=<data>ddd</data>' http://example.com/path/to/phpfile.php (*)
            simple Sachen doch eigentlich..? Warum geht das nicht? Vedammt, ich geb's auf.

            Du hast ja dort in den post-data einen fertigen Request-Body. Der verlangt genau wie Parameter in der URL, dass die Nutzdaten prozent-kodiert sind, damit man deren Zeichen nicht mit den Trennzeichen der Werte verwechselt. Hast du dir um das Maskieren Gedanken gemacht? Von allein wird wget den String sicherlich nicht auseinandernehmen und die entsprechenden Teile kodieren. Wie sollte es das auch können? Es weiß ja ebenso wie der Empfänger nicht, was da konkret wie zusammengehört.

            Lo!

            1. Hi,

              wget --post-data 'tgp=<data>ddd</data>' http://example.com/path/to/phpfile.php (*)
              simple Sachen doch eigentlich..? Warum geht das nicht? Vedammt, ich geb's auf.

              Du hast ja dort in den post-data einen fertigen Request-Body. Der verlangt genau wie Parameter in der URL, dass die Nutzdaten prozent-kodiert sind, damit man deren Zeichen nicht mit den Trennzeichen der Werte verwechselt. Hast du dir um das Maskieren Gedanken gemacht? Von allein wird wget den String sicherlich nicht auseinandernehmen und die entsprechenden Teile kodieren. Wie sollte es das auch können? Es weiß ja ebenso wie der Empfänger nicht, was da konkret wie zusammengehört.

              doch, doch, ich weiss schon. Alles schon probiert, war ein blödes Beispiel Auch ein:

              wget --post-data 'tgp=test' http://example.com/path/to/phpfile.php

              ändert ja nix! Das muss nicht urlkodiert werden. Da liege ich doch richtig?

              meraner

              1. Hi,

                Auch ein:

                wget --post-data 'tgp=test' http://example.com/path/to/phpfile.php

                ändert ja nix! Das muss nicht urlkodiert werden. Da liege ich doch richtig?

                Nee, aber dass es als XML akzeptiert wird, kannst du auch nicht erwarten :-)

                Vielleicht wäre es hilfreich, jetzt mal die Geheimniskrämerei zu beenden, und uns die tatsächliche Adresse des Testformulars und des Service zu nennen, damit man das mal selber testen kann.

                Sollte das nicht möglich sein, lautet die finale Antwort: Wende dich mit deinem Problem an den Betreiber des Service.

                MfG ChrisB

                --
                RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
                1. Hi,

                  Auch ein:

                  wget --post-data 'tgp=test' http://example.com/path/to/phpfile.php

                  ändert ja nix! Das muss nicht urlkodiert werden. Da liege ich doch richtig?

                  Nee, aber dass es als XML akzeptiert wird, kannst du auch nicht erwarten :-)

                  He, he, das nicht. Aber wie gesagt, eine entsprechene Fehlermeldung müsste  - dem Formular gleich - ausgegeben werden. Das Formular akzeptiert auch ein "x", gibt dann aber eine Fehlermeldung aus, dass die XML-Struktur nicht stimmt.

                  Vielleicht wäre es hilfreich, jetzt mal die Geheimniskrämerei zu beenden, und uns die tatsächliche Adresse des Testformulars und des Service zu nennen, damit man das mal selber testen kann.

                  das darf ich leider nicht, würde ich gerne machen.

                  Sollte das nicht möglich sein, lautet die finale Antwort: Wende dich mit deinem Problem an den Betreiber des Service.

                  Das ist der Plan. Allerdings können die weder englisch noch deutsch und selbst die Doku ist auf polnisch. Schwierig, schwierig wird das noch.

                  danke für die mühe
                  meraner

                  1. Hi,

                    Wende dich mit deinem Problem an den Betreiber des Service.

                    Das ist der Plan. Allerdings können die weder englisch noch deutsch und selbst die Doku ist auf polnisch. Schwierig, schwierig wird das noch.

                    Wer bietet im Web Services an, aber kann nicht wenigstens auf Englisch Support zur Verfügung stellen? Sachen gibt's ...
                    (Mal ganz davon abgesehen, dass ich nicht sehe, wie man überhaupt sowas Programmieren kann, wenn keine Englischkenntnisse vorhanden sind.)

                    Tja, dann bleibt dir wohl nur, per Google Translate zu versuchen, dich auf Polnisch verständlich zu machen, und in gleicher Weise die Antwort auszuwerten :-) (Sofern du keinen Polnischsprachler findest, der dir bei der Kommunikation helfen kann.)
                    Oder den Anbieter zu wechseln - wenn man mit dem noch nicht mal auf Englisch kommunizieren kann, möchte ich nicht wirklich wissen, was für'ne Klitsche das eigentlich ist, und welchen Qualitätslevel man von denen erwarten kann ...

                    MfG ChrisB

                    --
                    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
                    1. ARRRGH!!!!!!

                      Die URL in der Doku weicht um 1 Zeichen (!!!) von der URL im Testformular ab.
                      Jetzt gehts, verflucht.... das Perfide daran war, dass diese URL auch noch auf Polnisch ist und trotzdem -wenn auch nicht korrekt- funktioniert und Feedback gegeben hat.

                      Sorry, man muss echt SEHR genau hinsehen manchmal

                      meraner

  3. Anmerkung:

    wenn ich im Test-Formular keinen Inhalt eingebe, kommt die gleiche Meldung, wie mein Curl-Versuch: "XML KONNTE NICHT GELADEN WERDEN"

    Also werden eventuell keine Daten übertragen? Aber selbst das hier:

      
    curl_setopt($ch, CURLOPT_POST, 1);  
    curl_setopt($ch, CURLOPT_POSTFIELDS, array('tpd' => "<xml></xml>"));  
    
    

    oder

      
    curl_setopt($ch, CURLOPT_POSTFIELDS,'tpd=<test></test');  
    
    

    bringt nichts.

    Selbes XML im Test-Formular ergibt "WRONG XML STRUCTURE"

    1. Hi,

      Aber selbst das hier:

      curl_setopt($ch, CURLOPT_POST, 1);
      curl_setopt($ch, CURLOPT_POSTFIELDS, array('tpd' => "<xml></xml>"));

      
      >   
      > oder  
      >   
      > ~~~php
        
      
      > curl_setopt($ch, CURLOPT_POSTFIELDS,'tpd=<test></test');  
      > 
      
      

      bringt nichts.

      Und den korrekten Feldnamen zu verwenden auch nicht ...? :-P

      MfG ChrisB

      --
      RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
      1. Hi,

        Und den korrekten Feldnamen zu verwenden auch nicht ...? :-P

        man kann ja nicht alles preisgeben ;)

        Auch ein schnöder Kommandozeilenaufruf von curl bringt nichts:

        curl -d 'tpg=test' http://example.com/path/to/file.php

        :(