Bagaimana cara mengembalikan objek JSON dengan API REST kustom di Magento 2?

14

Saya sedang menulis demo API REST khusus; sekarang ia dapat mengembalikan angka dan string dalam demo saya, tetapi saya ingin mengembalikan objek JSON seperti API ISTIRAHAT lainnya.

Dalam demo saya, saya memanggil Magento 2 API (yaitu mendapatkan info pelanggan: http: //localhost/index.php/rest/V1/customers/1 ) dengan curl, dan ia mengembalikan string 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 \": \ "Tampilan Toko Default \", \ "email \": \ "[email protected] \ ", \" firstname \ ": \" azol \ ", \" lastname \ ": \" young \ ", \" store_id \ ": 1, \" website_id \ ": 1, \" address \ ": [{ \ "id \": 1, \ "customer_id \": 1, \ "region \": {\ "region_code \": \ "AR \", \ "region \": \ "Arad \", \ "region_id \ ": 279}, \" region_id \ ": 279, \" country_id \ ": \" RO \ ", \" street \ ": [\" abc \ "], \" telephone \ ": \" 111 \ ",\"Kode Pos\":\"1111 \ ", \" city \ ": \" def \ ", \" firstname \ ": \" azol \ ", \" nama belakang \ ": \" young \ ", \" default_billing \ ": true}], \ "disable_auto_group_change \": 0} "

Responsnya adalah string JSON, tetapi semua kunci memiliki garis miring di dalamnya. Saya tahu saya bisa menghapus tebasan dengan str_replace, tapi itu cara yang bodoh. Apakah ada cara lain untuk mengembalikan objek JSON tanpa garis miring di dalam kunci?

************ PEMBARUAN 2016.12.27 ************

Saya menempelkan kode pengujian saya di sini:

   $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\":\"[email protected]\",\"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
sumber
Kamu coba dengan return json_encode($result, JSON_UNESCAPED_SLASHES);?
Khoa TruongDinh
ya, saya sudah mencobanya, itu akan melempar pengecualian, karena $ hasil adalah string
azol.young
Coba cara lain: $json_string = stripslashes($result)danreturn json_decode($json_string, true);
Khoa TruongDinh

Jawaban:

1

Kita bisa menggunakan json_encodedengan JSON_UNESCAPED_SLASHES:

json_encode($response, JSON_UNESCAPED_SLASHES);
Khoa TruongDinh
sumber
hai, ya, saya sudah melakukannya dalam kode saya, tetapi masih memiliki slash
azol.young
Apakah Anda mencoba dengan stripslashes()fungsi atau json_encode($str, JSON_UNESCAPED_SLASHES);?
Khoa TruongDinh
Baca jawaban saya yang diperbarui.
Khoa TruongDinh
1
Coba $ this -> _ response-> representJson (json_encode ($ data));
Pratik
Hai Khoa, terima kasih! Saya sudah mencoba kode "json_encode ($ response, JSON_UNESCAPED_SLASHES);" dan stripslashes ("hai i \" azol ") ;, Ini masih memangkas .......
azol.young
1

Buat ws.php di direktori root Magento 2 dan rekatkan kode di bawah ini dalam file:

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

Setelah ini jalankan file ini menggunakan tautan seperti http: //localhost/magento2/ws.php di browser dan periksa output.

Nilesh Gosai
sumber
1

Saya mencoba menggunakan skrip berikut untuk menguji apakah saya mendapatkan garis miring dalam respons API yang sama:

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

Yang menghasilkan respons ini (terpotong oleh fungsi var_dump dari 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":"...

Seperti yang Anda lihat, tidak ada garis miring dalam respons saya.

Jadi saya sarankan Anda memiliki dua opsi:

  • Selidiki mengapa konfigurasi CURL Anda mengembalikan respons dengan garis miring. Mungkin itu ada hubungannya dengan menggunakan oauth? Sepertinya ada sesuatu yang mengambil respons mentah dari cURL dan kemudian mencoba melakukan sesuatu (seperti keluaran) dan dalam proses menambahkan garis miring
  • Bertekunlah dengan menemukan cara menghapus garis miring menggunakan str_replaceatau serupa.

Setelah mendapatkan respons tanpa garis miring, Anda dapat menggunakan satu-baris berikut untuk memaksa PHP untuk mengubah string menjadi objek JSON:

$object = json_decode( $output, false, 512, JSON_FORCE_OBJECT);
Memproses delapan
sumber