Ein data POST via Curl funktioniert nicht.

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Ein data POST via Curl funktioniert nicht.

    Hallo Profis,

    ich habe ein Problem bei einem kleinen PHP Projekt. Ich schreibe aktuell die Funktionen für ein Webfrontend über welches ich die REST API einer Software ansteuern möchte. Erst logge ich mich mit CURL "in der Software ein" und speicher einen cookie. In einem zweiten Schritt möchte ich "in der Software" als Authorisierter User Projekte anlegen. Der Hersteller gibt mir folgendes vor:

    curl -v \
    -b cookie.txt \
    -X POST \
    -H "Content-Type: application/json" \
    -d '{"name": "myProjectName", "description": "123456789"}' \
    http://localhost/projekt.json

    Wenn ich diesen Curlbefehl (nach dem Login über Curl) über das Terminal ausführe, funktioniert alles wie gewünscht. Über PHP bekomme ich das aber nicht hin.

    PS: Habe den Code geändert:
    PHP-Code:
    ////////////////////////////////////////////////////////////////////
    // Create Production
    ////////////////////////////////////////////////////////////////////
    $url "http://testserver/projekt.json";

    $ch curl_init(); 

    // read and edit Cookie from txt 
    $handle fopen($cookie'r');
    $contents fread($handlefilesize($cookie));
    fclose($handle);

    $token str_replace("\t"'='substr($contentsstrpos($contents'login-token')));

    //curl options
    curl_setopt($chCURLOPT_SSL_VERIFYPEERfalse); // Accepts all CAs 
    curl_setopt($chCURLOPT_URL$url);
    curl_setopt($chCURLOPT_CUSTOMREQUESTPOST);
    curl_setopt($chCURLOPT_RETURNTRANSFERtrue); 
    curl_setopt($chCURLOPT_POSTtrue);
    curl_setopt($chCURLOPT_VERBOSEtrue);
    curl_setopt($chCURLOPT_HEADERtrue);
    curl_setopt($chCURLOPT_CRLFtrue);
    curl_setopt($chCURLINFO_HEADER_OUTtrue);

    //Post data as json
    $data json_encode(array(
        
    'name' => 'Namederproduction',
      
    'description' => 'Beschreibungderproduction'
        
    ));

    curl_setopt($chCURLOPT_POSTFIELDS$data);

    //header
    $header = array('Cookie: '.$token,
    'Content-Length: '.strlen($data),
    'Content-Type: application/json;charset=UTF-8',
    'Accept: application/json;charset=UTF-8');

    curl_setopt($chCURLOPT_HTTPHEADER$header);

    $output curl_exec($ch);

    curl_close($ch);

    return 
    $output
    Ich sitze an dem Problem jetzt schon einige Zeit und wage jetzt den Schritt im Forum nachzufragen. Vielleicht hat ja einer von euch ne gute Idee.

    Lieben Gruß aus Köln
    Zuletzt geändert von hansflorian; 24.10.2014, 09:32. Grund: Code angepasst

  • #2
    REST ist zustandslos, es gibt also kein Login mittels Session oder Cookie. Also egal, was du da hast, es ist kein REST.

    Hast du schon mal geschaut, ob das Cookie-File überhaupt angelegt wird und was es enthält?

    Kommentar


    • #3
      Hallo, das Cookiefile wird angelegt.

      HTML-Code:
      # Netscape HTTP Cookie File
      # http://curl.haxx.se/docs/http-cookies.html
      # This file was generated by libcurl! Edit at your own risk.
      
      #HttpOnly_testserver.com	 FALSE	/	FALSE	0	login-token	9ed6270b-0e7e-42dc-8df4-7e6f5f08c278%3a23edd5f3-77e7-4f9e-a161-05f2870b9651_0098d925fc17dfd1%3acrx.default
      Mittlerweile bekomme ich statt einem Authorisierungsfehler 401 einen Bad Request 400. Ich ziehe mir den login-token aus der txt, speicher ihn zwischen und füge ihn manuell als Cookie in den header. Scheint zu klappen.

      Laut API bedeutet der Fehler 400:
      HTML-Code:
      400 Bad Request	A required property is missing in the request body.
      Wenn ich mir den BODY ausgebe:
      HTML-Code:
      BODY: java.lang.IllegalArgumentException: The validated object is null...........
      Wenn ich mir die json encodierten POST daten ausgeben, erhalte ich :
      HTML-Code:
      {"name":"Namederproduction"}
      also in der selben Form, wie ich auch im Terminal die Daten übergebe. (siehe oben CURL Befehl) Die Description welche ich im oberen Beispiel noch als Data übergeben habe wird laut API nicht required.

      Scheinbar bleibt der Body leer.

      Hast du ne Idee ? Gibts da nen Trick ?

      Kommentar


      • #4
        Zitat von hansflorian Beitrag anzeigen
        Wenn ich mir die json encodierten POST daten ausgeben, erhalte ich :
        Das heißt, du encodest die empfangenden Daten erst auf Serverseite als JSON, um diese Ausgabe zu erhalten?

        Sieht so aus, als ob du gar kein JSON sendest –
        PHP-Code:
        curl_setopt($chCURLOPT_POSTFIELDS$data); 
        – das erzeugt nicht automagisch JSON aus dem Inhalt deines Arrays.
        I don't believe in rebirth. Actually, I never did in my whole lives.

        Kommentar


        • #5
          Der Code oben ist nun aktualisiert.

          PHP-Code:
          $data json_encode(array(
              
          'name' => 'Namederproduction',
            
          'description' => 'Beschreibungderproduction'
              
          )); 
          So hab ich aus den Daten ein Json gemacht.

          Ich habe Probleme, den doch recht simplen Curl Befehl in PHP zu übersetzen
          Zuletzt geändert von hansflorian; 23.10.2014, 13:11.

          Kommentar


          • #6
            Du setzt nicht den Content-Type. Den solltest du auf application/json setzen, wenn du JSON-Daten sendest.

            http://www.lornajane.net/posts/2011/...-with-php-curl

            Kommentar


            • #7
              Danke, das habe ich beim "kürzen" des Codes für den Forumspost versehentlich abgeschnitten.
              Den $header den ich definiere verwende ich auch. Danke aber für den Hinweis. Ich hab's oben angepasst.

              Kommentar


              • #8
                HTML-Code:
                curl -v \
                     -b cookie.txt \
                     -X POST \
                     -F ':parameters={"destination": "http://localhost/project.json", "mediaPaths": ["media://file.mxf"], "comment": "Kommentar"}' \
                     http://localhost/projekt.v1.json
                Wisst ihr was [COLOR="red"]:[/COLOR]parameters bedeutet ?
                Also speziell der Doppelpunkt.

                PHP-Code:
                //Build the MediaPaths Array
                $mediaPaths_array = array('media://file.mxf');

                //Json_Encode the MediaPaths Array
                $data_encode json_encode(array(
                    
                'destination' => 'http://localhost/project.v1.json',
                    
                'mediaPaths' => $mediaPaths_array,
                    
                'comment' => 'Kommentar'
                  
                ), JSON_UNESCAPED_SLASHES);

                //Built Data for Post
                $data ':parameters='.$data_encode
                Das arameters habe ich mir bisher vor den encodierten Daten geschrieben. Scheint aber der falsche Weg zu sein ?!

                Ne Idee ?

                Kommentar


                • #9
                  Hey,
                  hatte auch mal das Problem. Oft liegt’s an fehlenden oder falschen Headern. Probier mal:​

                  $ch = curl_init();
                  curl_setopt($ch, CURLOPT_URL, "https://deine-url.de/api/");
                  curl_setopt($ch, CURLOPT_POST, 1);
                  curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
                  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                  curl_setopt($ch, CURLOPT_HTTPHEADER, [
                  'Content-Type: application/x-www-form-urlencoded'
                  ]);
                  $response = curl_exec($ch);

                  if (curl_errno($ch)) echo 'Fehler: ' . curl_error($ch);
                  else echo 'Response: ' . $response;

                  curl_close($ch);

                  Wichtig: Wenn JSON erwartet wird, nutz json_encode($data) und setz den Header auf application/json. Auch SSL oder fehlende Tokens checken. Wenn’s dann immer noch klemmt, schau dir den Server-Response an!

                  Hoffe, das hilft!
                  Zuletzt geändert von Anmorg93; 21.11.2024, 12:12.

                  Kommentar


                  • #10
                    Anmorg93
                    Respekt, du bist ja nur um rund 10 Jahre zu spät dran.

                    Kommentar

                    Lädt...
                    X