cURL Frage (CURLOPT_POSTFIELDS => ...) bekomme ich nicht hin

Guten Abend.

Ich habe da mal eine Frage an die PHP (cURL) Spezis.
Ich versuche per HTTP Request einen Parameter in meinem Fibaro HomeCenter2 zu ändern.
Dazu verwende ich folgendes Script:

<?php

    $ip            = "192.168.70.28";      // IP Fibaro HC2
    $user_pw_base64       = "UserPasswort_Base64";
    $json          = "";
    $deviceID = 5;

    // Funktion HC change Paramter
    $json = HC_changeParameter($deviceID);  // Fibaro Dimmer2 (MasterID)
    var_dump($json);



    function HC_changeParameter($deviceID)  
    {
        global $ip;
        global $user_pw_base64;

        $curl = curl_init();
        curl_setopt_array($curl, 
            array(
                CURLOPT_URL => '192.168.70.28/api/devices/5',
                CURLOPT_RETURNTRANSFER => true,
                CURLOPT_CONNECTTIMEOUT => 5,
                CURLOPT_CUSTOMREQUEST, 'PUT',
                CURLOPT_HTTP_VERSION => 'HTTP/1.1',
                CURLOPT_POSTFIELDS  => '{"properties":{"parameters":[{"id":"19","size":"1","value":"22"}]}}',
                CURLOPT_HTTPHEADER => array('Content-Type: application/json' , 'authorization: Basic '.$user_pw_base64), 
            )
        );

        $response = curl_exec($curl);
        var_dump($response);

        $json = json_decode($response); //Dekodierung nach Json
        curl_close($curl); 

        return $json;
    };

Es funktioniert aber nicht. Ich erhalte NULL in $json String zurück !
Lasse ich die Zeile .„CURLOPT_POSTFIELDS => …“ weg, bekomme ich die Werte des Gerätes angezeigt (Zugang funktioniert also grundsätzlich schon Mal).

Verwende ich in „Postman“ die gleichen Eingabewerte (siehe Bild) klappt der Request und ich erhalte ein Status 200 OK mit den neuen Parametereinträgen zurück.

Was mache ich falsch mit meinem CURLOPT_POSTFIELDS => … Eintrag ?
Oder fehlt noch etwas ?

Vielen Dank schonmal für Eure Hilfe.

Gruß
lueralba

Die meisten deiner Curl Optionen sehen komisch aus.
CURLOPT_HTTP_VERSION ist ein integer kein String.
Für die Anmeldung gibt es die Optionen CURLOPT_HTTPAUTH und CURLOPT_USERPWD.
Da musst du den Header dafür nicht selber erstellen.
Allerdings musst die Größe der Daten im Header angeben, was vermutlich das eigentliche Problem ist.
Hier sind die Optionen beschrieben:
https://www.php.net/manual/de/function.curl-setopt.php
Und hier ein Beispiel:
https://www.php.net/manual/de/function.curl-setopt.php#96056
Michael

Ich habe lang nicht mehr in postman geschaut, aber wenn es dort funktioniert solltest Du Dir von Postman auch den kompletten Code in Postman in PHP ausgeben lassen können, dann musst Du diesen dann nur noch 1:1 kopieren. Must Du mal schauen wie das in der aktuellen Version geht.

Vielen Dank für Eure prompte Reaktion.

CURLOPT_HTTP_VERSION ist ein integer kein String.

Hat bisher keine Probleme bereitet, hab ich jetzt mal rausgenommen.

Allerdings musst die Größe der Daten im Header angeben

Habe ich nachgesetzt, noch keine Verbesserung.

Postman Code:

curl --location --request PUT ‚192.168.70.28/api/devices/5‘
–header ‚Authorization: Basic base64 PW‘
–header ‚Content-Type: application/json‘
–data-raw ‚{„properties“:{„parameters“:[{„id“:„19“,„size“:„1“,„value“:„10“}]}}‘

Wie setze ich das jetzt korrekt 1:1 ein ? :confused:

„–data-raw“ irritiert mich besonders. Sollte das nicht „json Codiert“ sein.
Hier, denke ich auch, sitzt mein Fehler (da es ja ohne diese Zeile die aktuellen Daten zurückbringt):slight_smile:

lueralba

Das ist nicht PHP sondern cURL.
Du gehst bei dem Request in Postman auf Code (rechts), in dem neu öffnenden Fenster klickst Du an der Seite nicht auf cURL sondern auf PHP - cURL dann schreibt Dir Postman den passenden Code in PHP hin. Diesen Code kopierst Du dann einfach nach IP-Symcon.

Das war der Durchbruch :slight_smile:

Vielen Dank für die schnelle und wie immer super Unterstützung.
Dabei war ich schon so kurz davor .:banghead:
Postman: Code -> PHP cURL , Copy&Paste und läuft sofort:rolleyes:

Vielen, vielen Dank an Euch

Habe gestern Nacht viel über PHP cURL gelesen und gelernt :smiley:

Nun kann ich weitermachen…

Codeschnipsel für alle, die auch Mal nach dem Thema suchen

<?php



    // Funktion HC change Paramter(HCL-ID , Parameternr. , Byteanzahl , Wert)
    $status = HC_changeParameter(5,19,1,7);  // Dimmer2 (MasterID)
    echo $status; // 200 = Ok



    function HC_changeParameter($deviceID,$id,$size,$value)  
    {
        $url            = "192.168.70.28/api/devices/";      // HC2 + REST API Pfad
        $user_pw_base64 = "....User:Passwort_Base64....."; //Base64

        // Der "PHP-Curl - Code" kann mit der Software "Postman" o.ä. generiert und kopiert werden.
        $postfield = "{\"properties\":{\"parameters\":[{\"id\":\"" .$id. "\",\"size\":\"" .$size. "\",\"value\":\"" .$value. "\"}]}}";

        $curl = curl_init();

        curl_setopt_array($curl, array(
        CURLOPT_URL => $url . $deviceID,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => "",
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 0,
        CURLOPT_FOLLOWLOCATION => true,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => "PUT",
        CURLOPT_POSTFIELDS =>$postfield,
        CURLOPT_HTTPHEADER => array(
            "Authorization: Basic ".$user_pw_base64,
            "Content-Type: application/json"
        ),
        ));

        $response = curl_exec($curl);
        $status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
        return $status;

        curl_close($curl);

    };

Sonnige Grüße aus Berlin
lueralba