Làm cách nào để nhận được phản hồi từ API REST ở định dạng JSON trong Magento 2?


7

Tôi đã sử dụng các tài nguyên trong Bộ tạo một dịch vụ web REST mới trong Magento 2 , và Tạo một dịch vụ web REST mới trong Magento 2, để tạo một mô-đun API tùy chỉnh, nhưng phản hồi ở định dạng XML. Tôi cần một phản hồi ở định dạng JSON với các cặp giá trị chính. Tôi có thể làm cái này như thế nào?

Câu trả lời:


14

Dưới đây là mô-đun api tùy chỉnh với giá trị cặp khóa
Để nhận phản hồi JSON, trong ứng dụng khách đặt tiêu đề Phản hồi thành"Content-Type: application/json; charset=utf-8"

và nếu bạn cần giá trị cặp khóa đang phản hồi thì nên có khóa và giá trị như /rest/V1/categorieschúng ta cần tạo giao diện dữ liệu

Để kiểm tra plugin tải xuống Chrome có tên là ứng dụng khách còn lại, hãy gọi url

url mô-đun bên dưới sẽ là http://yourdomein.com/magento2/rest/V1/getinfo

ứng dụng \ code \ Sugarcode \ Customapi \ đăng ký.php :

<?php
\Magento\Framework\Component\ComponentRegistrar::register(
    \Magento\Framework\Component\ComponentRegistrar::MODULE,
    'Sugarcode_Customapi',
    __DIR__
);

ứng dụng \ code \ Sugarcode \ Customapi \ etc \ module.xml :

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd">
    <module name="Sugarcode_Customapi" setup_version="2.0.0"/>
</config>

ứng dụng \ code \ Sugarcode \ Customapi \ etc \ di.xml :

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd">

    <preference for="Sugarcode\Customapi\Api\TestInterface"
                type="Sugarcode\Customapi\Model\Test" />

    <preference for="Sugarcode\Customapi\Api\Data\TestdataInterface" type="Sugarcode\Customapi\Model\Testmodel" />
</config>

ứng dụng \ code \ Sugarcode \ Customapi \ etc \ webapi.xml :

<?xml version="1.0"?>
<routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../app/code/Magento/Webapi/etc/webapi.xsd">

    <!-- Example: curl http://127.0.0.1/index.php/rest/V1/calculator/add/1/2 -->
    <route url="/V1/getinfo" method="GET">
        <service class="Sugarcode\Customapi\Api\TestInterface" method="getinfo" />
        <resources>
            <resource ref="anonymous" />
        </resources>
    </route>

</routes>

ứng dụng \ code \ Sugarcode \ Customapi \ Api \ TestInterface.php :

<?php

namespace Sugarcode\Customapi\Api;

use Sugarcode\Customapi\Api\Data\TestdataInterface;

interface TestInterface
{
    /**
     * Retrieve list of info
     *
     * @throws \Magento\Framework\Exception\NoSuchEntityException If ID is not found
     * @return \Sugarcode\Customapi\Api\Data\TestdataInterface containing Tree objects
     */
    public function getinfo();

}

đừng xóa bình luận quan trọng nhất

app \ code \ Sugarcode \ Customapi \ Api \ Data \ TestdataInterface.php (đặt và nhận dữ liệu):

<?php

namespace Sugarcode\Customapi\Api\Data;

/**
 * @api
 */
interface TestdataInterface
{

    /**
     * Get name
     *
     * @return string
     */
    public function getName();

      /**
     * Set name
     *
     * @param string $name
     * @return $this
     */
    public function setName($id);

}

ứng dụng \ code \ Sugarcode \ Customapi \ Model \ Test.php :

<?php

namespace Sugarcode\Customapi\Model;

use Sugarcode\Customapi\Api\TestInterface;

/**
 * Defines the implementaiton class of the calculator service contract.
 */
class Test implements TestInterface
{
    /**
     * Return the sum of the two numbers.
     *
     * @api
     * @param int $num1 Left hand operand.
     * @param int $num2 Right hand operand.
     * @return int The sum of the two values.
     */
    protected $dataFactory;
    public function __construct(\Sugarcode\Customapi\Api\Data\TestdataInterfaceFactory $dataFactory)
    {
        $this->dataFactory = $dataFactory;
    }



    public function getinfo() {
        $page_object = $this->dataFactory->create();
        $page_object->setName('Hello');
        return $page_object;        

    }

}

ứng dụng \ code \ Sugarcode \ Customapi \ Model \ Testmodel.php :

<?php

namespace Sugarcode\Customapi\Model;

class Testmodel extends \Magento\Framework\Model\AbstractModel implements
    \Sugarcode\Customapi\Api\Data\TestdataInterface 
{
    const KEY_NAME = 'name';


     public function __construct(
        \Magento\Framework\Model\Context $context,
        \Magento\Framework\Registry $registry,
        \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null,
        \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
        array $data = []
    ) {
        parent::__construct($context, $registry, $resource, $resourceCollection, $data);
    }


    public function getName()
    {
        return $this->_getData(self::KEY_NAME);
    }


    /**
     * Set name
     *
     * @param string $name
     * @return $this
     */
    public function setName($name)
    {
        return $this->setData(self::KEY_NAME, $name);
    }


}

Đây là cách tốt nhất để xử lý phản hồi cặp giá trị khóa json. Tôi biết bạn có một giải pháp khác ở đây magento.stackexchange.com/questions/94618/, nhưng dường như đó không phải là một cách tiếp cận tự nhiên. Cảm ơn bạn.
Hoàng Trinh

Điều này đang tạo ra vấn đề về thời gian nâng cấp magento
Pushpendra Singh

8

Định dạng phản hồi (XML hoặc JSON) được chọn dựa trên Accepttiêu đề, đặt nó application/jsonở phía máy khách.


: - nếu tôi đặt url api (phương thức get) trong trình duyệt thì nó có định dạng xml, làm thế nào để đặt nó ở định dạng json thì có bất kỳ tùy chọn nào để đặt định dạng phản hồi
Pradeep Kumar

Nếu bạn cần điều này chỉ cho mục đích thử nghiệm / dev, hãy xóa tất cả các trình kết xuất ngoại trừ JSON trong Magento/Webapi/etc/di.xml. Nếu không, hãy sử dụng một số plugin cho trình duyệt để đặt các tiêu đề thích hợp (ví dụ: ứng dụng khách REST cho Firefox). Dù sao, chỉ có thể truy cập tài nguyên 'ẩn danh' mà không có Authorizationtiêu đề.
Alex Paliarush

Là api / dữ liệu bắt buộc cho nút mà tôi trong mảng tôi muốn khóa giá trị cặp trong trường hợp đó làm thế nào với thư mục dữ liệu ngoài
Pradeep Kumar

1
Không chắc chắn tôi hiểu những gì bạn yêu cầu, xin vui lòng làm rõ.
Alex Paliarush

Khi tôi gọi api của mình, tôi cần phản hồi theo cặp giá trị khóa, vì trong mô-đun lõi, họ đã viết giao diện api / dữ liệu, ngoài ra chúng ta có thể kết thúc phản hồi với giá trị cặp khóa như trên ảnh chụp màn hình của các danh mục
Pradeep Kumar

4

Sử dụng một cURL:

    $URL = curl_init( $www );
    curl_setopt( $URL, CURLOPT_HEADER, 0 );
    curl_setopt( $URL, CURLOPT_CUSTOMREQUEST, "GET" );
    curl_setopt( $URL, CURLOPT_RETURNTRANSFER, true );
    curl_setopt( $URL, CURLOPT_HTTPHEADER, array(
            "Content-Type: application/json",
            "Authorization: Bearer " . $token_API
    ) );

Trong bước này về json_decode()chức năng PHP, tham số thứ hai truetrả về JSON trong mảng fortmat, xem thêm: http://php.net/json_decode

$URL = json_decode(curl_exec($URL), true);

Và sau đó:

curl_close( $URL ); //close cURL conn

print_r( $URL ); //result

1
Làm thế nào tôi có thể nhận được $ token_API này của khách hàng theo chương trình?
Newbie

@Newbie Nhận mã thông báo quản trị POST / V1 / integration / admin / token integrationAdminTokenServiceV1 Nhận mã thông báo khách hàng POST / V1 / integration / customer / token integrationCustomerTokenServiceV1 Nếu bạn nhận được chương trình PHP này một cách hợp lý API WEB. Phông chữ: devdocs.magento.com/guides/v2.0/get-started/authentication/ khăn
Matt Silva

3

Tôi khuyên bạn nên sử dụng ứng dụng khách REST nhẹ trên trình duyệt. Nếu bạn đã cài đặt chrome, chỉ cần cài đặt "tiện ích mở rộng bưu điện". Ở đó bạn có thể chọn đại diện mà bạn muốn xem câu trả lời. nhập mô tả hình ảnh ở đây

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.