2

I would like to know what you think the best approach is for retrieving product data from an external source in Magento 2

I have tried two options and both work but I would like to know what you think is the best method:

Method 1 - Custom Endpoint

Using a controller I can make a GET request to: http://domain.com/modulename/product/index And pass the SKU as a Param in the request from an external source

Then my controller will call my helper class and return a JSON array of product data:

public function execute()
{
    /**
     *  We would normally create some basic Auth check before instatiating the getProduct() method
     *  The Auth token would be stored in the admin config of the module using system.xml
     */
    return $this->resultJsonFactory->create()->setData($this->helper->getProduct());
}

And my Helper

  public function getProduct()
    {
        // This is just for the test I am going to load a configurable product then get the child products
        // Normally the loop would check but this is only for the test.
        $product = $this->products->get('MH01');
        // This is the parent product name and concatenated the SKU
        $productData['name'] = $product->getName() . ' ' . $product->getSku();
        // Get the child products
        $childIds = $this->configurable->getChildrenIds($product->getId());
        $childData = [];
        foreach ($childIds[0] as $childId) {
            $simple = $this->products->getById($childId);
            $childData[] = [
                'name' => $simple->getName(),
                'sku' => $simple->getSku()
            ];
        }
        return ['parent' => $productData, 'children' => $childData];
    }

The other approach would be to use the Magento REST API Webservice method

Method 2 - REST API

I set the route via webapi.xml then make a GET request to: http://domain.com/rest/V1/module-name/products/{$id}

<?xml version="1.0" ?>
<routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Webapi:etc/webapi.xsd">
    <route method="GET" url="/V1/costa-test/products/:id">
        <service class="Costa\Test\Api\ProductsManagementInterface" method="getProducts"/>
        <resources>
            <resource ref="anonymous"/>
        </resources>
    </route>
</routes>

The ProductsManagementInterface Class will take the $id and pass it

interface ProductsManagementInterface
{
    /**
     * GET for products api
     * @param string $id
     * @return string
     */
    public function getProducts($id);
}

Then in my ProductsManagement Class

public function getProducts($id)
{
    // This is just for the test I am going to load a configurable product then get the child products
    // Normally the loop would check but this is only for the test.
    $product = $this->products->getById($id);
    // This is the parent product name and concatenated the SKU
    $productData['name'] = $product->getName() . ' ' . $product->getSku();
    // Get the child products
    $childIds = $this->configurable->getChildrenIds($product->getId());
    $childData = [];
    /** @var $childIds array */
    foreach ($childIds[0] as $childId) {
        $simple = $this->products->getById($childId);
        $childData[] = [
            'name' => $simple->getName(),
            'sku' => $simple->getSku(),
        ];
    }
    return ['parent' => $productData, 'children' => $childData];
}

Both approaches work well but what would you say is the best method?

2

I recommend using the Rest API.

  • If the default Magento APIs can meet your requirements, should use it. We don’t need to spend money and time on creating the new one.
  • Security: APIs mostly need the security. Magento tried to do it for you.
  • how to get products data using rest API ? – sangan Jan 3 '18 at 10:54

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.