Magento 2'de özel bir REST API ile bir JSON nesnesi nasıl döndürülür?


14

Özel bir REST API demosu yazıyorum; Şimdi benim demo numaraları ve dizeleri döndürebilirsiniz, ama ben diğer REST API'leri gibi bir JSON nesnesi döndürmek istiyorum.

Demomda, Magento 2 API'sini çağırıyorum (yani müşteri bilgilerini alın: http: //localhost/index.php/rest/V1/customers/1 ) curl ile ve bir JSON dizesi döndürüyor:

"{\" 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 \": \ "Varsayılan Mağaza Görünümü \", \ "email \": \ "75358050@qq.com \ " \ "ad \": \ "azol \", \ "soyad \": \ "genç \", \ "Store_id \": 1, \ "website_id \": 1, \ "adresleri \": [{ \ "id \": 1, \ "CUSTOMER_ID \": 1, \ "bölgesi \": {\ "REGION_CODE \": \ "AR \", \ "bölgesi \": \ "Arad \", \ "region_id \ ": 279} \" region_id \ ": 279, \" country_id \ ": \" RO \ "\ "sokak \": [\ "abc \"], \ "telefon \": \" 111 \ "\ "posta kodu \": \"1111 \", \ "şehir \": \ "def \", \ "ad \": \ "azol \", \ "soyad \": \ "Genç \", \ "\" default_billing: true}], \ "disable_auto_group_change \": 0}"

Yanıt bir JSON dizesidir, ancak tüm tuşların içinde eğik çizgi vardır. Eğik çizgiyi kaldırabileceğimi biliyorum str_replace, ama bu aptalca bir yol. Anahtarlarda eğik çizgi olmadan bir JSON nesnesini döndürmenin başka bir yolu var mı?

************ GÜNCELLEME 2016.12.27 ************

Test kodumu buraya yapıştırdım:

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

Sen denedin return json_encode($result, JSON_UNESCAPED_SLASHES);mi?
Khoa TruongDinh

evet, deniyorum, bir istisna atacak, çünkü $ sonuç bir dize
azol.young

Başka bir yol deneyin: $json_string = stripslashes($result)vereturn json_decode($json_string, true);
Khoa TruongDinh

Yanıtlar:


1

Biz kullanabilirsiniz json_encodeile JSON_UNESCAPED_SLASHES:

json_encode($response, JSON_UNESCAPED_SLASHES);

merhaba, evet,
kodumda

Birlikte denedin mi stripslashes()fonksiyon ya json_encode($str, JSON_UNESCAPED_SLASHES);?
Khoa TruongDinh

Güncellenmiş cevabımı okuyun.
Khoa TruongDinh

1
$ This -> _ response-> RepresJson (json_encode ($ data));
Pratik

Merhaba Khoa, Teşekkürler! Size kod denedim "json_encode ($ response, JSON_UNESCAPED_SLASHES);" and stripslashes ("hi i \" azol ") ;, Hala eğik çizgi var .......
azol.young

1

Magento 2'nin kök dizininde ws.php oluşturun ve aşağıdaki kodu dosyaya yapıştırın:

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

Bundan sonra bu dosyayı tarayıcıda http: //localhost/magento2/ws.php gibi bir bağlantı kullanarak çalıştırın ve çıktıyı kontrol edin.


1

Aynı API yanıtında eğik çizgiler alıp almadığımı test etmek için aşağıdaki komut dosyasını kullanarak denedim:

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

Bu yanıtı üretir (PHP'nin var_dump işlevi tarafından kesilir):

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

Gördüğünüz gibi, cevabımda eğik çizgi yok.

Bu yüzden iki seçeneğiniz olduğunu öneririm:

  • CURL yapılandırmanızın neden eğik çizgilerle yanıt döndürdüğünü araştırın. Belki oauth kullanmakla ilgili bir şeydir? Görünüşe göre bir şey cURL'den ham yanıt alıyor ve daha sonra bir şey yapmaya çalışıyor (çıktı gibi) ve süreçte eğik çizgiler ekliyor
  • Eğik çizgileri kullanarak str_replaceveya benzerlerini kaldırmanın bir yolunu bulmaya devam edin.

Yanıtınızı eğik çizgiler olmadan aldıktan sonra, PHP'yi dizeyi bir JSON nesnesine dönüştürmeye zorlamak için aşağıdaki tek satırı kullanabilirsiniz:

$object = json_decode( $output, false, 512, JSON_FORCE_OBJECT);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.