ম্যাজেন্টো 2 তে একটি কাস্টম REST এপিআই দিয়ে কোনও জেএসওএন অবজেক্ট কীভাবে ফিরে আসবেন?


14

আমি একটি কাস্টম REST এপিআই ডেমো লিখছি; এখন এটি আমার ডেমোতে নম্বর এবং স্ট্রিংগুলি ফিরিয়ে দিতে পারে, তবে আমি চাই যে এটি অন্য আরএসটি এপিআইয়ের মতো একটি জেএসওএন বস্তুটি ফিরিয়ে দেবে।

আমার ডেমোতে, আমি কার্জ সহ ম্যাজেন্টো 2 এপিআই (যেমন গ্রাহকের তথ্য পান: HTTP: //localhost/index.php/rest/V1/customers/1 ) কল করি এবং এটি একটি জেএসএন স্ট্রিং ফেরত দেয়:

"{\" আইডি \ ": 1, group" গ্রুপ_আইডি \ ": 1, default" ডিফল্ট_বিলিং \ ": \" 1 \ ", created" নির্মিত_ট at ": 2016" 2016-12-13 14: 57: 30 \ " , \ "আপডেট_এটি \": \ "2016-12-13 15:20:19,", created "তৈরি_ইন \": \ "ডিফল্ট স্টোর দেখুন \", email "ইমেল \": 75 "75358050@qq.com \ ", \" FIRSTNAME \ ": \" azol \ ", \" LASTNAME \ ": \" তরুণ \ ", \" store_id \ ": 1, \" website_id \ ": 1, \" ঠিকানাগুলি \ ": [{ \ "ID \": 1, \ "গ্রাহক \": 1, \ "অঞ্চল \": {\ "region_code \": \ "শিরোণামে \", \ "অঞ্চল \": \ "অরাদের \", \ "region_id \ ": 279}, \" region_id \ ": 279, \" country_id \ ": \" রিটার্নিং \ ", \" রাস্তায় \ ": [\" এবিসি \ "], \" টেলিফোন \ ": \" 111 \ ", \" পোস্টকোড \ ": \"1111 \ ", \" শহর \ ": \" Def \ ", \" FIRSTNAME \ ": \" azol \ ", \" LASTNAME \ ": \" তরুণ \ ", \" default_billing \ ": সত্য}], \ "disable_auto_group_change \": 0} "

প্রতিক্রিয়াটি একটি JSON স্ট্রিং, তবে সমস্ত কীগুলির মধ্যে একটি স্ল্যাশ রয়েছে। আমি জানি আমি এর সাথে স্ল্যাশ সরিয়ে ফেলতে পারি str_replaceতবে এটি একটি বোকা উপায়। কীগুলির মধ্যে স্ল্যাশ ছাড়াই কোনও JSON অবজেক্ট ফেরত দেওয়ার কোনও অন্য উপায় নেই?

************ আপডেট ২০১ 2016.১২.২7 ************

আমি আমার পরীক্ষার কোডটি এখানে আটকিয়েছি:

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

আপনি দিয়ে চেষ্টা return json_encode($result, JSON_UNESCAPED_SLASHES);?
খোয়া ট্রুংডিনহ

হ্যাঁ, আমি চেষ্টা করে দেখছি, এটি একটি ব্যতিক্রম ছুঁড়ে ফেলবে, কারণ $ ফলাফলটি একটি স্ট্রিং
আজল.ইউং

অন্য কোনও উপায়ে চেষ্টা করুন: $json_string = stripslashes($result)এবংreturn json_decode($json_string, true);
খোয়া ট্রুংডিনহ

উত্তর:


1

আমরা এর json_encodeসাথে ব্যবহার করতে পারি JSON_UNESCAPED_SLASHES:

json_encode($response, JSON_UNESCAPED_SLASHES);

হাই, হ্যাঁ, আমি আমার
কোডটিতে

আপনি stripslashes()ফাংশন দিয়ে চেষ্টা করেছেন বা json_encode($str, JSON_UNESCAPED_SLASHES);?
খোয়া ট্রুংডিনহ

আমার আপডেট করা উত্তরটি পড়ুন।
খোয়া ট্রুংডিনহ

1
চেষ্টা করুন $ এটি -> _ প্রতিক্রিয়া-> প্রতিনিধিত্ব করুন জসন (json_encode ($ ডেটা));
প্রতীক

হাই খোয়া, আপনাকে ধন্যবাদ! আমি আপনার "json_encode (try প্রতিক্রিয়া, JSON_UNESCAPED_SLASHES) কোড চেষ্টা করেছি;" এবং স্ট্র্যাপস্ল্যাশস ("হাই আই \" আজোল ") ;, এটি এখনও স্ল্যাশ হয়েছে .......
আজল.ইউং

1

ম্যাজেন্টো 2 এর মূল ডিরেক্টরিতে ws.php তৈরি করুন এবং ফাইলের কোডের নীচে পেস্ট করুন:

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

আমি একই এপিআই প্রতিক্রিয়াতে স্ল্যাশ পাচ্ছি কিনা তা পরীক্ষা করার জন্য আমি নিম্নলিখিত স্ক্রিপ্টটি ব্যবহার করে চেষ্টা করেছি:

<?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 -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":"...

যেমন আপনি দেখতে পাচ্ছেন, আমার প্রতিক্রিয়াতে কোনও কমতি নেই।

সুতরাং আমি আপনাকে দুটি বিকল্প আছে বলে পরামর্শ দিচ্ছি:

  • আপনার সিআরএল কনফিগারেশন কেন স্ল্যাশ সহ প্রতিক্রিয়া ফিরিয়ে দিচ্ছে তা তদন্ত করুন। সম্ভবত এটি ওউথ ব্যবহার করে কিছু করার আছে? দেখে মনে হচ্ছে যে কোনও কিছু সিআরএল থেকে কাঁচা প্রতিক্রিয়া নিয়েছে এবং তারপরে কিছু করার চেষ্টা করছে (আউটপুট এটির মতো) এবং প্রক্রিয়াতে স্ল্যাশ যুক্ত করছে
  • স্ল্যাশগুলি ব্যবহার করে str_replaceবা অনুরূপ সরিয়ে ফেলার কোনও উপায় সন্ধানের জন্য অধ্যবসায় করুন ।

আপনি একবারে স্ল্যাশ ছাড়াই আপনার প্রতিক্রিয়া পেয়েছেন, আপনি পিএইচপিকে স্ট্রিংটিকে জেএসওএন সামগ্রীতে রূপান্তর করতে বাধ্য করার জন্য নিম্নলিখিত এক-লাইনটি ব্যবহার করতে পারেন:

$object = json_decode( $output, false, 512, JSON_FORCE_OBJECT);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.