Wie kann ich ein JSON-Objekt mit einer benutzerdefinierten REST-API in Magento 2 zurückgeben?


14

Ich schreibe eine benutzerdefinierte REST-API-Demo. Jetzt kann es Zahlen und Zeichenfolgen in meiner Demo zurückgeben, aber ich möchte, dass es ein JSON-Objekt wie andere REST-APIs zurückgibt.

In meiner Demo rufe ich die Magento 2-API mit curl auf (dh erhalte Kundeninformationen: http: //localhost/index.php/rest/V1/customers/1 ) und gibt einen JSON-String zurück:

{"id": 1, "group_id": 1, "default_billing": "1", "created_at": "2016-12-13 14: 57: 30" , "updated_at": "2016-12-13 15:20:19", "created_in": "Default Store View", "email": "75358050@qq.com" "," Vorname ":" Azol "," Nachname ":" Young "," Store-ID ": 1," Website-ID ": 1," Adressen ": [{ "id": 1, "customer_id": 1, "region": {"region_code": "AR", "region": "Arad", "region_id" ": 279}," Regions-ID ": 279," Länder-ID ":" RO "," Straße ": [" abc "]," Telefon ":" 111 " "," Postleitzahl ":"1111 "," Stadt ":" def "," Vorname ":" Azol "," Nachname ":" jung "," Standardabrechnung ": true}], "disable_auto_group_change": 0} "

Die Antwort ist eine JSON-Zeichenfolge, aber alle Schlüssel enthalten einen Schrägstrich. Ich weiß, dass ich den Schrägstrich mit entfernen kann str_replace, aber es ist ein dummer Weg. Gibt es eine andere Möglichkeit, ein JSON-Objekt ohne Schrägstriche in Schlüsseln zurückzugeben?

************ UPDATE 2016.12.27 ************

Ich habe meinen Testcode hier eingefügt:

   $method = 'GET';
    $url = 'http://localhost/index.php/rest/V1/customers/1';

    $data = [
        'oauth_consumer_key' => $this::consumerKey,
        'oauth_nonce' => md5(uniqid(rand(), true)),
        'oauth_signature_method' => 'HMAC-SHA1',
        'oauth_timestamp' => time(),
        'oauth_token' => $this::accessToken,
        'oauth_version' => '1.0',
    ];

    $data['oauth_signature'] = $this->sign($method, $url, $data, $this::consumerSecret, $this::accessTokenSecret);

    $curl = curl_init();

    curl_setopt_array($curl, [
        CURLOPT_RETURNTRANSFER => 1,
        CURLOPT_URL => $url,
        CURLOPT_HTTPHEADER => [
            'Authorization: OAuth ' . http_build_query($data, '', ','),
            'Content-Type: application/json'
        ], 
    ]);

    $result = curl_exec($curl);
    curl_close($curl);

    // this code has slash still
    //return stripslashes("hi i\" azol"); 

    // has slashes still
    //return stripcslashes("{\"id\":1,\"group_id\":1,\"default_billing\":\"1\",\"created_at\":\"2016-12-13 14:57:30\",\"updated_at\":\"2016-12-13 15:20:19\",\"created_in\":\"Default Store View\",\"email\":\"75358050@qq.com\",\"firstname\":\"azol\",\"lastname\":\"young\",\"store_id\":1,\"website_id\":1,\"addresses\":[{\"id\":1,\"customer_id\":1,\"region\":{\"region_code\":\"AR\",\"region\":\"Arad\",\"region_id\":279},\"region_id\":279,\"country_id\":\"RO\",\"street\":[\"abc\"],\"telephone\":\"111\",\"postcode\":\"1111\",\"city\":\"def\",\"firstname\":\"azol\",\"lastname\":\"young\",\"default_billing\":true}],\"disable_auto_group_change\":0}");

    // has slashes still
    //return json_encode(json_decode($result), JSON_UNESCAPED_SLASHES);

    // this code will throw and expcetion:
    // Undefined property: *****\*****\Model\Mycustom::$_response
    //return  $this->_response->representJson(json_encode($data));

    return $result;

Du versuchst es mit return json_encode($result, JSON_UNESCAPED_SLASHES);?
Khoa TruongDinh

Ja, ich habe es versucht, es wird eine Ausnahme
auslösen

Versuchen Sie es auf andere Weise: $json_string = stripslashes($result)undreturn json_decode($json_string, true);
Khoa TruongDinh

Antworten:


1

Wir können json_encodemit verwenden JSON_UNESCAPED_SLASHES:

json_encode($response, JSON_UNESCAPED_SLASHES);

Hallo, ja, ich habe es in meinem Code getan, aber immer noch einen Schrägstrich
azol.young

Hast du das mit stripslashes()funktion versucht oder json_encode($str, JSON_UNESCAPED_SLASHES);?
Khoa TruongDinh

Lesen Sie meine aktualisierte Antwort.
Khoa TruongDinh

1
Versuchen Sie $ this -> _ response-> representJson (json_encode ($ data));
Pratik

Hallo Khoa, danke! Ich habe versucht, Sie Code "json_encode ($ response, JSON_UNESCAPED_SLASHES)"; und Stripslashes ("hi i \" azol ") ;, Es ist immer noch Schrägstrich .......
azol.young

1

Erstellen Sie ws.php im Stammverzeichnis von Magento 2 und fügen Sie den folgenden Code in die Datei ein:

<?php
    use Magento\Framework\App\Bootstrap;
    require __DIR__ . '/app/bootstrap.php';
    $params = $_SERVER;
    $bootstrap = Bootstrap::create(BP, $params);


    function sign($method, $url, $data, $consumerSecret, $tokenSecret)
    {
        $url = urlEncodeAsZend($url);
        $data = urlEncodeAsZend(http_build_query($data, '', '&'));
        $data = implode('&', [$method, $url, $data]);
        $secret = implode('&', [$consumerSecret, $tokenSecret]);
        return base64_encode(hash_hmac('sha1', $data, $secret, true));
    }

    function urlEncodeAsZend($value)
    {
        $encoded = rawurlencode($value);
        $encoded = str_replace('%7E', '~', $encoded);
        return $encoded;
    }

    // REPLACE WITH YOUR ACTUAL DATA OBTAINED WHILE CREATING NEW INTEGRATION
    $consumerKey = 'YOUR_CONSUMER_KEY';
    $consumerSecret = 'YOUR_CONSUMER_SECRET';
    $accessToken = 'YOUR_ACCESS_TOKEN';
    $accessTokenSecret = 'YOUR_ACCESS_TOKEN_SECRET';

    $method = 'GET';
    $url = 'http://localhost/magento2/rest/V1/customers/1';

//
$data = [
    'oauth_consumer_key' => $consumerKey,
    'oauth_nonce' => md5(uniqid(rand(), true)),
    'oauth_signature_method' => 'HMAC-SHA1',
    'oauth_timestamp' => time(),
    'oauth_token' => $accessToken,
    'oauth_version' => '1.0',
];

$data['oauth_signature'] = sign($method, $url, $data, $consumerSecret, $accessTokenSecret);

$curl = curl_init();

curl_setopt_array($curl, [
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_URL => $url,
    CURLOPT_HTTPHEADER => [
        'Authorization: OAuth ' . http_build_query($data, '', ',')
    ]
]);

$result = curl_exec($curl);
curl_close($curl);

echo $result;

$response = \Zend_Json::decode($result);
echo "<pre>";
print_r($response);
echo "</pre>";

Danach starte diese Datei mit einem Link wie http: //localhost/magento2/ws.php im Browser und überprüfe die Ausgabe.


1

Ich habe versucht, mithilfe des folgenden Skripts zu testen, ob in derselben API-Antwort Schrägstriche angezeigt werden:

<?php
// create a new cURL resource
$ch = curl_init();

// set URL and other appropriate options
curl_setopt($ch, CURLOPT_URL, "http://www.example.test/rest/all/V1/customers/12408");
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Authorization: Bearer oc34ouc8lvyvxcbn16llx7dfrjygdoh2', 'Accept: application/json']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

// grab URL and pass it to the browser
$result = curl_exec($ch);

var_dump($result);

// close cURL resource, and free up system resources
curl_close($ch);

Wodurch wird diese Antwort erzeugt (abgeschnitten von der var_dump-Funktion von PHP):

$ php -f apitest2.php 
/var/www/html/dfl/htdocs/apitest2.php:14:
string(1120) "{"id":12408,"group_id":13,"default_billing":"544","default_shipping":"544","created_at":"2018-05-24 08:32:59","updated_at":"2018-05-24 08:32:59","created_in":"Default Store View","email":"...

Wie Sie sehen, keine Schrägstriche in meiner Antwort.

Ich schlage vor, Sie haben zwei Möglichkeiten:

  • Ermitteln Sie, warum Ihre cURL-Konfiguration eine Antwort mit Schrägstrichen zurückgibt. Vielleicht hat es etwas mit oauth zu tun? Es sieht so aus, als würde etwas die rohe Antwort von cURL nehmen und dann versuchen, etwas zu tun (wie es auszugeben) und dabei die Schrägstriche hinzuzufügen
  • Suchen Sie weiter nach einer Möglichkeit, die Schrägstriche mit str_replaceo.ä. zu entfernen .

Sobald Sie Ihre Antwort ohne Schrägstriche erhalten haben, können Sie mit der folgenden einzeiligen Anweisung PHP zwingen, die Zeichenfolge in ein JSON-Objekt zu konvertieren:

$object = json_decode( $output, false, 512, JSON_FORCE_OBJECT);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.