Rest api to get product by sku with custom attribute option value in Magento 2.1
Please follow the below steps from custom module if it success then you can customize whatever you want.
Note:- we are creating a new product attribute and associating the required data to the product attribute.
Step 1:- create a new module using silk software tool ex:- CompanyName_ModuleName
Step 2:- create a new product attribute using install script (or) admin end.
Step 3:- create a webapi.xml => /app/code/CompanyName/ModuleName/etc/webapi.xml
<?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 url="/V1/product/:sku" method="GET">
<service class="CompanyName\ModuleName\Api\ProductsInterface" method="getAdditional"/>
<resources>
<resource ref="anonymous"/>
</resources>
</route>
</routes>
Step 4: app/code/CompanyName/ModuleName/etc/di.xml
<?xml version="1.0" ?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<preference for="CompanyName\ModuleName\Api\ProductsInterface" type="CompanyName\ModuleName\Model\Products" />
</config>
Step 5: app/code/CompanyName/ModuleName/Api/ProductsInterface.php
<?php
namespace CompanyName\ModuleName\Api;
interface ProductsInterface
{
/**
* Get info about product by product SKU
*
* @param string $sku
* @param bool $editMode
* @param int|null $storeId
* @param bool $forceReload
* @return \Magento\Catalog\Api\Data\ProductInterface
* @throws \Magento\Framework\Exception\NoSuchEntityException
*/
public function getAdditional($sku, $editMode = false, $storeId = null, $forceReload = false);
}
Step 6: app/code/CompanyName/ModuleName/Model/Products.php
<?php
namespace CompanyName\ModuleName\Model;
use Magento\Framework\Pricing\PriceCurrencyInterface;
class Products implements \Ewall\Mobileshop\Api\ProductsInterface
{
/**
* @var \Magento\Catalog\Model\ProductFactory
*/
protected $productFactory;
/**
* @var Product[]
*/
protected $instances = [];
/**
* @var \Magento\Catalog\Model\ResourceModel\Product
*/
protected $resourceModel;
/**
* @var \Magento\Store\Model\StoreManagerInterface
*/
protected $storeManager;
/**
* @var \Magento\Catalog\Helper\ImageFactory
*/
protected $helperFactory;
/**
* @var \Magento\Store\Model\App\Emulation
*/
protected $appEmulation;
/**
* Review model
*
* @var \Magento\Review\Model\ReviewFactory
*/
protected $_reviewFactory;
/**
* Review resource model
*
* @var \Magento\Review\Model\ResourceModel\Review\CollectionFactory
*/
protected $_reviewsColFactory;
/**
* @var PriceCurrencyInterface
*/
protected $priceCurrency;
/**
* ProductRepository constructor.
* @param \Magento\Catalog\Model\ProductFactory $productFactory
* @param \Magento\Catalog\Model\ResourceModel\Product $resourceModel
* @param \Magento\Store\Model\StoreManagerInterface $storeManager
* @param \Magento\Review\Model\ReviewFactory $reviewFactory
* @param \Magento\Review\Model\ResourceModel\Review\CollectionFactory $collectionFactory
* @param PriceCurrencyInterface $priceCurrency
*/
public function __construct(
\Magento\Catalog\Model\ProductFactory $productFactory,
\Magento\Catalog\Model\ResourceModel\Product $resourceModel,
\Magento\Store\Model\StoreManagerInterface $storeManager,
\Magento\Store\Model\App\Emulation $appEmulation,
\Magento\Catalog\Helper\ImageFactory $helperFactory,
\Magento\Review\Model\ReviewFactory $reviewFactory,
\Magento\Review\Model\ResourceModel\Review\CollectionFactory $collectionFactory,
PriceCurrencyInterface $priceCurrency
) {
$this->productFactory = $productFactory;
$this->storeManager = $storeManager;
$this->resourceModel = $resourceModel;
$this->helperFactory = $helperFactory;
$this->appEmulation = $appEmulation;
$this->_reviewFactory = $reviewFactory;
$this->_reviewsColFactory = $collectionFactory;
$this->priceCurrency = $priceCurrency;
}
/**
* {@inheritdoc}
*/
public function getAdditional($sku, $editMode = false, $storeId = null, $forceReload = false)
{
$cacheKey = $this->getCacheKey([$editMode, $storeId]);
if (!isset($this->instances[$sku][$cacheKey]) || $forceReload) {
$product = $this->productFactory->create();
$productId = $this->resourceModel->getIdBySku($sku);
if (!$productId) {
throw new NoSuchEntityException(__('Requested product doesn\'t exist'));
}
if ($editMode) {
$product->setData('_edit_mode', true);
}
if ($storeId !== null) {
$product->setData('store_id', $storeId);
} else {
$storeId = $this->storeManager->getStore()->getId();
}
$product->load($productId);
//Custom Attributes Data Added here
$moreInformation = $this->getMoreInformation($product);
$product->setCustomAttribute('more_information', $moreInformation);
// Custom Attributes Data Ends here
$this->instances[$sku][$cacheKey] = $product;
$this->instancesById[$product->getId()][$cacheKey] = $product;
}
return $this->instancesById[$product->getId()][$cacheKey];
}
/**
* Get key for cache
*
* @param array $data
* @return string
*/
protected function getCacheKey($data)
{
$serializeData = [];
foreach ($data as $key => $value) {
if (is_object($value)) {
$serializeData[$key] = $value->getId();
} else {
$serializeData[$key] = $value;
}
}
return md5(serialize($serializeData));
}
/**
* Get More information of the product
* @param \Magento\Catalog\Model\Product $product
* @return array
*/
protected function getMoreInformation($product)
{
$data = [];
$excludeAttr = [];
$attributes = $product->getAttributes();
foreach ($attributes as $attribute) {
if ($attribute->getIsVisibleOnFront() && !in_array($attribute->getAttributeCode(), $excludeAttr)) {
$value = $attribute->getFrontend()->getValue($product);
if (!$product->hasData($attribute->getAttributeCode())) {
$value = __('N/A');
} elseif ((string)$value == '') {
$value = __('No');
} elseif ($attribute->getFrontendInput() == 'price' && is_string($value)) {
$value = $this->priceCurrency->convertAndFormat($value);
}
if (is_string($value) && strlen($value)) {
$data[$attribute->getAttributeCode()] = [
'label' => __($attribute->getStoreLabel()),
'value' => $value,
'code' => $attribute->getAttributeCode(),
];
}
}
}
return $data;
}
}
Step 7: after did the changes make sure use di:compile
Step 8: open postman application for getting the result as shown below
Method: GET
UrL:- http://website.com/rest/V1/product/24-MB04
Step 9: Output