Magento 2 में एक कस्टम REST API के साथ JSON ऑब्जेक्ट कैसे लौटाएं?


14

मैं एक कस्टम REST API डेमो लिख रहा हूँ; अब यह मेरे डेमो में संख्याओं और तारों को वापस कर सकता है, लेकिन मैं चाहता हूं कि यह अन्य REST API की तरह JSON ऑब्जेक्ट लौटाए।

मेरे डेमो में, मैं कर्ल के साथ Magento 2 एपीआई (यानी ग्राहक जानकारी प्राप्त करता हूं: http: //localhost/index.php/rest/V1/customers/1 ), और यह JSON स्ट्रिंग लौटाता है:

"{\" id \ ": 1, \" group_id \ ": 1, \" default_billing \ ": \" 1 \ ", \" create_at \ ": \" 2016-12-13 14: 57: 30 \ " , \ "अद्यतन_त \": \ "2016-12-13 15:20:19 \", \ "बनाया_िन \": \ "डिफ़ॉल्ट स्टोर दृश्य \", \ "ईमेल \": \ "75358050@qq.com \" ", \" firstname \ ": \" azol \ ", \" उपनाम \ ": \" युवा \ ", \" store_id \ ": 1, \" website_id \ ": 1, \" के पते \ ": [{ \ "आईडी \": 1, \ "CUSTOMER_ID \": 1, \ "क्षेत्र \": {\ "REGION_CODE \": \ "एआर \", \ "क्षेत्र \": \ "अरद \", \ "region_id \ ": 279}, \" region_id \ ": 279, \" country_id \ ": \" आरओ \ ", \" सड़क \ ": [\" एबीसी \ "], \" टेलीफोन \ ": \" 111 \ ", \" पोस्टकोड \ ": \"1111 \ ", \" शहर \ ": \" डीईएफ़ \ ", \" firstname \ ": \" azol \ ", \" उपनाम \ ": \" युवा \ ", \" 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;

आप के साथ प्रयास करें return json_encode($result, JSON_UNESCAPED_SLASHES);?
खोआ TruongDinh 12

हाँ, मैं इसे
आज़माता

एक और तरीका आज़माएँ: $json_string = stripslashes($result)औरreturn json_decode($json_string, true);
खोआ ट्रून्गडिन्ह

जवाबों:


1

हम के json_encodeसाथ उपयोग कर सकते हैं JSON_UNESCAPED_SLASHES:

json_encode($response, JSON_UNESCAPED_SLASHES);

हाय, हाँ, मैंने इसे अपने कोड में किया है, लेकिन अभी भी स्लैश है
azol.young

आपने stripslashes()फंक्शन के साथ कोशिश की या json_encode($str, JSON_UNESCAPED_SLASHES);?
खोआ TruongDinh

पढ़ें मेरा अपडेटेड जवाब
खोआ TruongDinh

1
$ यह कोशिश करें -> _ प्रतिक्रिया-> प्रतिनिधित्वजोन (json_encode ($ डेटा));
प्रतीकात्मक

हाय खोआ, धन्यवाद! मैंने आपको "json_encode ($ response, JSON_UNESCAPED_SLASHES) कोड" आज़माने की कोशिश की है; और स्ट्रिप्सलैश ("हाय आई \" "एज़ोल");, यह अभी भी स्लैश है .......
azol.young

1

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

यह प्रतिक्रिया उत्पन्न करता है (PHP के 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":"...

जैसा कि आप देख सकते हैं, मेरी प्रतिक्रिया में कोई स्लैश नहीं है।

इसलिए मेरा सुझाव है कि आपके पास दो विकल्प हैं:

  • जांच करें कि आपका cURL कॉन्फ़िगरेशन स्लैश के साथ प्रतिक्रिया क्यों दे रहा है। शायद यह ओउथ का उपयोग करने के साथ कुछ करना है? ऐसा लगता है कि कुछ cURL से कच्ची प्रतिक्रिया ले रहा है और फिर कुछ करने की कोशिश कर रहा है (जैसे यह आउटपुट) और इस प्रक्रिया में स्लैश को जोड़ना
  • उपयोग str_replaceया समान स्लैश को हटाने का एक तरीका खोजने के साथ दृढ़ता से ।

एक बार जब आप स्लैश के बिना अपनी प्रतिक्रिया प्राप्त कर लेते हैं, तो आप स्ट्रिंग को JSON ऑब्जेक्ट में बदलने के लिए PHP को बाध्य करने के लिए निम्न एक-लाइन का उपयोग कर सकते हैं:

$object = json_decode( $output, false, 512, JSON_FORCE_OBJECT);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.