Làm cách nào để trả về một đối tượng JSON bằng API REST tùy chỉnh trong Magento 2?


14

Tôi đang viết một bản demo API REST tùy chỉnh; bây giờ nó có thể trả về số và chuỗi trong bản demo của tôi, nhưng tôi muốn nó trả về một đối tượng JSON như các API REST khác.

Trong bản demo của mình, tôi gọi API Magento 2 (tức là lấy thông tin khách hàng: http: //localhost/index.php/rest/V1/customers/1 ) bằng curl và nó trả về chuỗi JSON:

"{\" id \ ": 1, \" group_id \ ": 1, \" default_billing \ ": \" 1 \ ", \" created_at \ ": \" 2016-12-13 14: 57: 30 \ " , \ "update_at \": \ "2016-12-13 15:20:19 \", \ "created_in \": \ "Chế độ xem cửa hàng mặc định \", \ "email \": \ "75358050@qq.com \ ", \" Firstname \ ": \" azol \ ", \" Lastname \ ": \" young \ ", \" store_id \ ": 1, \" website_id \ ": 1, \" địa chỉ \ ": [{ \ "id \": 1, \ "customer_id \": 1, \ "area \": {\ "area_code \": \ "AR \", \ "area \": \ "Arad \", \ "area_id \ ": 279}, \" area_id \ ": 279, \" country_id \ ": \" RO \ ", \" street \ ": [\" abc \ "], \" phone \ ": \" 111 \ ", \" mã bưu điện \ ": \"1111 \ ", \" city \ ": \" def \ ", \" Firstname \ ": \" azol \ ", \" Lastname \ ": \" young \ ", \" default_billing \ ": true}], \ "eac_auto_group_change \": 0} "

Phản hồi là một chuỗi JSON, nhưng tất cả các khóa đều có dấu gạch chéo bên trong. Tôi biết tôi có thể xóa dấu gạch chéo bằng str_replace, nhưng đó là một cách ngu ngốc. Có cách nào khác để trả về một đối tượng JSON mà không bị gạch chéo trong các khóa không?

****** / TÌM HIỂU CẬP NHẬT 2016.12.27 ****** / 4

Tôi đã dán mã kiểm tra của tôi ở đây:

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

Bạn thử với return json_encode($result, JSON_UNESCAPED_SLASHES);?
Khoa TruongDinh

vâng, tôi đã thử rồi, nó sẽ đưa ra một ngoại lệ, vì $ result là một chuỗi
azol.young

Hãy thử một cách khác: $json_string = stripslashes($result)return json_decode($json_string, true);
Khoa TruongDinh

Câu trả lời:


1

Chúng tôi có thể sử dụng json_encodevới JSON_UNESCAPED_SLASHES:

json_encode($response, JSON_UNESCAPED_SLASHES);

xin chào, vâng, tôi đã làm điều đó trong mã của mình, nhưng vẫn có dấu gạch chéo
azol.young

Bạn đã thử với stripslashes()chức năng hay json_encode($str, JSON_UNESCAPED_SLASHES);?
Khoa TruongDinh

Đọc câu trả lời cập nhật của tôi.
Khoa TruongDinh

1
Hãy thử $ this -> _ answer-> đại diệnJson (json_encode ($ data));
Pratik

Chào Khoa, cảm ơn bạn! Tôi đã thử mã cho bạn "json_encode ($ reply, JSON_UNESCAPED_SLASHES);" và các dấu gạch chéo ("hi i \" azol ");, Nó vẫn có dấu gạch chéo .......
azol.young

1

Tạo ws.php trong thư mục gốc của magento 2 và dán mã bên dưới vào tệp:

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

Sau này chạy tệp này bằng liên kết như http: //localhost/magento2/ws.php trong trình duyệt và kiểm tra đầu ra.


1

Tôi đã thử sử dụng tập lệnh sau để kiểm tra xem tôi có bị gạch chéo trong cùng một phản hồi API hay không:

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

Cái nào tạo ra phản hồi này (bị cắt bởi hàm var_dump của 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":"...

Như bạn có thể thấy, không có dấu gạch chéo trong phản ứng của tôi.

Vì vậy, tôi đề nghị bạn có hai lựa chọn:

  • Điều tra lý do tại sao cấu hình cURL của bạn trả về phản hồi bằng dấu gạch chéo. Có lẽ đó là một cái gì đó để làm với việc sử dụng oauth? Có vẻ như một cái gì đó đang lấy phản hồi thô từ cURL và sau đó cố gắng làm một cái gì đó (như đầu ra nó) và trong quá trình thêm dấu gạch chéo
  • Kiên trì với việc tìm cách loại bỏ các dấu gạch chéo bằng cách sử dụng str_replacehoặc tương tự.

Khi bạn đã nhận được phản hồi của mình mà không bị gạch chéo, bạn có thể sử dụng một dòng sau để buộc PHP chuyển đổi chuỗi thành đối tượng JSON:

$object = json_decode( $output, false, 512, JSON_FORCE_OBJECT);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.