Comment renvoyer un objet JSON avec une API REST personnalisée dans Magento 2?


14

J'écris une démo d'API REST personnalisée; maintenant, il peut retourner des nombres et des chaînes dans ma démo, mais je veux qu'il retourne un objet JSON comme les autres API REST.

Dans ma démo, j'appelle l'API Magento 2 (c'est-à-dire obtenir les informations client: http: //localhost/index.php/rest/V1/customers/1 ) avec curl, et elle renvoie une chaîne JSON:

"{\" 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 \ ", \" prénom \ ": \" azol \ ", \" nom de famille \ ": \" young \ ", \" store_id \ ": 1, \" website_id \ ": 1, \" adresses \ ": [{ \ "id \": 1, \ "customer_id \": 1, \ "region \": {\ "region_code \": \ "AR \", \ "region \": \ "Arad \", \ "region_id \ ": 279}, \" region_id \ ": 279, \" country_id \ ": \" RO \ ", \" street \ ": [\" abc \ "], \" telephone \ ": \" 111 \ ", \" code postal \ ": \"1111 \ ", \" city \ ": \" def \ ", \" firstname \ ": \" azol \ ", \" lastname \ ": \" young \ ", \" default_billing \ ": true}], \ "disable_auto_group_change \": 0} "

La réponse est une chaîne JSON, mais toutes les clés contiennent une barre oblique. Je sais que je peux supprimer la barre oblique avec str_replace, mais c'est une façon stupide. Existe-t-il un autre moyen de renvoyer un objet JSON sans barres obliques dans les clés?

************ MISE À JOUR 2016.12.27 ************

J'ai collé mon code de test ici:

   $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;

Vous essayez avec return json_encode($result, JSON_UNESCAPED_SLASHES);?
Khoa TruongDinh

oui, je l'ai essayé, il
lèvera

Essayez une autre façon: $json_string = stripslashes($result)etreturn json_decode($json_string, true);
Khoa TruongDinh

Réponses:


1

Nous pouvons utiliser json_encodeavec JSON_UNESCAPED_SLASHES:

json_encode($response, JSON_UNESCAPED_SLASHES);

salut, oui, je l'ai fait dans mon code, mais il y a toujours une barre oblique
azol.young

Avez-vous essayé avec la stripslashes()fonction ou json_encode($str, JSON_UNESCAPED_SLASHES);?
Khoa TruongDinh

Lisez ma réponse mise à jour.
Khoa TruongDinh

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

Salut Khoa, merci! Je vous ai essayé de coder "json_encode ($ response, JSON_UNESCAPED_SLASHES);" et stripslashes ("hi i \" azol ") ;, il y a encore du slash .......
azol.young

1

Créez ws.php dans le répertoire racine de magento 2 et collez le code ci-dessous dans le fichier:

<?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>";

Après cela, exécutez ce fichier en utilisant un lien comme http: //localhost/magento2/ws.php dans le navigateur et vérifiez la sortie.


1

J'ai essayé d'utiliser le script suivant pour tester si j'obtiens des barres obliques dans la même réponse API:

<?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);

Ce qui produit cette réponse (tronquée par la fonction var_dump de 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":"...

Comme vous pouvez le voir, aucune barre oblique dans ma réponse.

Je vous propose donc deux options:

  • Recherchez pourquoi votre configuration cURL renvoie une réponse avec des barres obliques. Peut-être que cela a quelque chose à voir avec l'utilisation d'Oauth? Il semble que quelque chose prenne la réponse brute de cURL, puis essaie de faire quelque chose (comme la produire) et ajoute des barres obliques dans le processus
  • Persévérez pour trouver un moyen de supprimer les barres obliques en utilisant str_replaceou similaire.

Une fois que vous avez obtenu votre réponse sans barres obliques, vous pouvez utiliser la ligne suivante pour forcer PHP à convertir la chaîne en un objet JSON:

$object = json_decode( $output, false, 512, JSON_FORCE_OBJECT);
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.