Как вернуть объект JSON с пользовательским API REST в Magento 2?

14

Я пишу пользовательскую демонстрацию REST API; теперь он может возвращать числа и строки в моей демонстрации, но я хочу, чтобы он возвращал объект JSON, как и другие API REST.

В моей демонстрации я вызываю API Magento 2 (т.е. получаю информацию о клиенте: http: //localhost/index.php/rest/V1/customers/1 ) с помощью curl, и он возвращает строку JSON:

"{\" id \ ": 1, \" group_id \ ": 1, \" default_billing \ ": \" 1 \ ", \" creation_at \ ": \" 2016-12-13 14: 57: 30 \ " , \ "updated_at \": \ "2016-12-13 15:20:19 \", \ "creation_in \": \ "Представление хранилища по умолчанию \", \ "электронная почта \": \ "75358050@qq.com \ », \ "Имя \": \ "азол \", \ "Lastname \": \ "молодой \", \ "store_id \": 1, \ "website_id \": 1, \ "адреса \": [{ \ "идентификатор \": 1, \ "customer_id \": 1, \ "область \": {\ "region_code \": \ "АР \", \ "область \": \ "Арада \", \ "Region_ID \ ": 279}, \" Region_ID \ ": 279, \" country_id \ ": \" RO \ "\ "улица \": [\ "а \"], \ "телефон \": \" 111 \ "\ "почтовый индекс \": \"1111 \», \ "город \": \ "Защита \", \ "Имя \": \ "азол \", \ "Lastname \": \ "молодой \", \ "default_billing \": истинно}], \ "disable_auto_group_change \": 0}»

Ответом является строка JSON, но внутри всех ключей есть косая черта. Я знаю, что могу удалить косую черту str_replace, но это глупо. Есть ли другой способ вернуть объект JSON без слешей внутри ключей?

************ ОБНОВЛЕНИЕ 2016.12.27 ************

Я вставил свой тестовый код здесь:

   $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;
azol.young
источник
Вы пытаетесь с return json_encode($result, JSON_UNESCAPED_SLASHES);?
Khoa TruongDinh
да, я попробую, он выдаст исключение, потому что $ result является строкой
azol.young
Попробуйте по-другому: $json_string = stripslashes($result)иreturn json_decode($json_string, true);
Khoa TruongDinh

Ответы:

1

Мы можем использовать json_encodeс JSON_UNESCAPED_SLASHES:

json_encode($response, JSON_UNESCAPED_SLASHES);
Хоа ТруонгДинь
источник
привет, да, я сделал это в своем коде, но все еще есть слэш
azol.young
Вы пробовали с stripslashes()функцией или json_encode($str, JSON_UNESCAPED_SLASHES);?
Khoa TruongDinh
Прочитайте мой обновленный ответ.
Khoa TruongDinh
1
Попробуйте $ this -> _ response-> ПредставитьJson (json_encode ($ data));
Pratik
Привет Хоа, спасибо! Я пробовал код "json_encode ($ response, JSON_UNESCAPED_SLASHES);" и полосатая коса ("Привет, я \" azol "); это все еще имеет слэш .......
azol.young
1

Создайте ws.php в корневом каталоге magento 2 и вставьте следующий код в файл:

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

После этого запустите этот файл, используя ссылку вроде http: //localhost/magento2/ws.php в браузере, и проверьте вывод.

Нилеш Госай
источник
1

Я попытался использовать следующий скрипт, чтобы проверить, получаю ли я косую черту в том же ответе 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);

Который производит этот ответ (усеченный функцией var_dump в 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":"...

Как видите, в моем ответе нет косых черт.

Поэтому я предлагаю вам два варианта:

  • Выясните, почему ваша конфигурация cURL возвращает ответ с косой чертой. Возможно, это как-то связано с использованием oauth? Похоже, что-то берет необработанный ответ от cURL, а затем пытается что-то сделать (например, вывести его) и в процессе добавления косой черты
  • Продолжайте искать способ удаления косой черты, используя str_replaceили подобное.

Получив ответ без косой черты, вы можете использовать следующую однострочную строку, чтобы заставить PHP преобразовать строку в объект JSON:

$object = json_decode( $output, false, 512, JSON_FORCE_OBJECT);
ProcessEight
источник