Currently Magento 2 is providing JSON and XML response in web REST API
I want to include a custom response format PDF.
So if any third-party will call our API then we can sen them PDF in response.
magento2pdfrest api
Currently Magento 2 is providing JSON and XML response in web REST API
I want to include a custom response format PDF.
So if any third-party will call our API then we can sen them PDF in response.
Below are the custom api module with key pair value
To get JSON response, in client set Response headers to "Content-Type: application/json; charset=utf-8"
and if you need key pair value that is in response should have key and value as like /rest/V1/categories
we need to create data interface
To test in Chrome download plugin called rest client app call the url
below module url will be http://yourdomein.com/magento2/rest/V1/getinfo
app\code\Sugarcode\Customapi\registration.php:
<?php
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'Sugarcode_Customapi',
__DIR__
);
app\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>
app\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>
app\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>
app\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();
}
don't remove comments its most important
app\code\Sugarcode\Customapi\Api\Data\TestdataInterface.php (set and get data):
<?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);
}
app\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;
}
}
app\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);
}
}
I think what you're looking for is catalog_product_save_after
. This event gets called for every product save action, including new products.
In order to use it you could do the following in your module:
app\code\Vendor\Module\etc\adminhtml\events.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
<event name="catalog_product_save_after">
<observer name="vendor_module_product_save" instance="Vendor\Module\Observer\Productsaveafter" />
</event>
</config>
Then in Productsaveafter
you can implement logic to connect to your own software and perform actions like adding or updating the product.
Example:
app\code\Vendor\Module\Observer\Productsaveafter.php
<?php
namespace Vendor\Module\Observer;
class Productsaveafter implements ObserverInterface{
public function execute(\Magento\Framework\Event\Observer $observer) {
$product = $observer->getProduct();
// Your logic to do stuff with $product
}
}
UPDATE: The Rest API is one-way only. It's not meant to notify you when changes occur. You're supposed to go get the data yourself. Hence the module suggestion that hooks onto an event.
But if you are unable to add code to Magento, you could implement a lightweight API call that occurs often, say every minute, that queries for the most recent product IDs and compares them to your system. Then if it's a new product you can proceed to get the full product details. There will be a slight delay but it'll still be fast.
Note that it's not an approach that I can recommend because it might put a strain on your store's resources.
Best Answer
Just my idea: We shouldn't do this. We can add the download link or generated link to API response. There are some additional points: