Magento 2 API – Today we are going to learn how to create rest based API for Magento 2.
I have worked on Magento 1 and found it very difficult to create a rest webAPI.
But as I was expecting Magento 2 has a very easy way to define your API resources for the module, specially defining routes for Magento API integration.
Also, check how to create GraphQL API in Adobe Commerce
To create a rest API there are some certain requirements for Magento API integration :
- you need to create an interface in your module’s API folder.
- then you need to define all the API methods that you want to expose to the web in the interface.
- all the methods should have a doc-block.
- in the doc-block @api must be defined
- if your method expects parameters than all the parameters must be defined in the doc-block as @params <type> <param> <description>
- return type of the method must be defined as @return <type> <description>
- concrete class of the method must be defined and it should give the definition of all the API methods and should inherit the doc-block.
If your API method do not met any of the above requirements then rest API will not work for magento 2 integration API.
Now, for an example lets create a test module named Webkul_TestApi for better understanding :
create your module composer.json, registration.php and module.xml files:
* @copyright Copyright (c) Webkul Software Private Limited (https://webkul.com)
* @license https://store.webkul.com/license.html
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
"name": "webkul/marketplace-api",
"description": "Marketplace api for magento2",
"php": "~5.5.0|~5.6.0|~7.0.0",
"magento/module-config": "100.0.*",
"magento/module-store": "100.0.*",
"magento/module-checkout": "100.0.*",
"magento/module-catalog": "100.0.*",
"magento/module-sales": "100.0.*",
"magento/module-customer": "100.0.*",
"magento/module-payment": "100.0.*",
"magento/module-quote": "100.0.*",
"magento/module-backend": "100.0.*",
"magento/module-directory": "100.0.*",
"magento/module-theme": "100.0.*",
"magento/framework": "100.0.*"
"type": "magento2-module",
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
<module name="Webkul_TestApi" />
Now create TestApiManagementInterface.php file in app/code/Webkul/TestApi/Api/ folder:
namespace Webkul\TestApi\Api;
interface TestApiManagementInterface
* @return \Webkul\TestApi\Api\Data\TestApiInterface
public function getApiData($id);
the above will define all the api methods you want to expose, all these methods must have doc-block defined with @api, @param and @return else it will not work for Magento 2 integration API.
Now create TestApiManagementInterface implementation file in app/code/Webkul/TestApi/Model/Api folder:
namespace Webkul\TestApi\Model\Api;
class TestApiManagement implements \Webkul\TestApi\Api\TestApiManagementInterface
protected $_testApiFactory;
public function __construct(
\Webkul\TestApi\Model\TestApiFactory $testApiFactory
$this->_testApiFactory = $testApiFactory;
* @return \Webkul\TestApi\Api\Data\TestApiInterface
public function getApiData($id)
$model = $this->_testApiFactory
throw new \Magento\Framework\Exception\LocalizedException(
} catch (\Magento\Framework\Exception\LocalizedException $e) {
$returnArray['error'] = $e->getMessage();
$returnArray['status'] = 0;
} catch (\Exception $e) {
$returnArray['error'] = __('unable to process request');
$returnArray['status'] = 2;
the above class is the implementation of the interface as you can see I have only created one method getApiData as it is defined in the interface its return type is \Webkul\TestApi\Api\Data\TestApiInterface class
So now we have to create this class and its implementation too for api for magento 2.
Now create a model TestApi.php inside app/code/Webkul/TestApi/Model, this is a fake model it is not connected to any table since its only for testing purpose, I have just defined some setters and getters for some fields.
namespace Webkul\TestApi\Model;
* Marketplace Product Model.
* @method \Webkul\Marketplace\Model\ResourceModel\Product _getResource()
* @method \Webkul\Marketplace\Model\ResourceModel\Product getResource()
class TestApi implements \Webkul\TestApi\Api\Data\TestApiInterface
* @return \Webkul\Marketplace\Api\Data\ProductInterface
public function setId($id)
public function getTitle()
return 'this is test title';
* @return \Webkul\Marketplace\Api\Data\ProductInterface
public function setTitle($title)
public function getDescription()
return 'this is test api description';
* @return \Webkul\Marketplace\Api\Data\ProductInterface
public function setDescription($desc)
the above class has getTitle, getDescription and getId so we must expect that api for magento 2 will return these values in the response.
Now create the interface class for the above implementation in app/code/Webkul/TestApi/Api/Data.
* @copyright Copyright (c) Webkul Software Private Limited (https://webkul.com)
* @license https://store.webkul.com/license.html
namespace Webkul\TestApi\Api\Data;
* Marketplace product interface.
interface TestApiInterface
* Constants for keys of data array. Identical to the name of the getter in snake case
const ENTITY_ID = 'entity_id';
const DESC = 'description';
* @return \Webkul\Marketplace\Api\Data\ProductInterface
public function setId($id);
public function getTitle();
* @return \Webkul\Marketplace\Api\Data\ProductInterface
public function setTitle($title);
public function getDescription();
* @return \Webkul\Marketplace\Api\Data\ProductInterface
public function setDescription($desc);
Now You need to create “app/code/Webkul/TestApi/etc/di.xml” file to map interfaces with the concrete classes:
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<preference for="Webkul\TestApi\Api\TestApiManagementInterface" type="Webkul\TestApi\Model\Api\TestApiManagement" />
<preference for="Webkul\TestApi\Api\Data\TestApiInterface" type="Webkul\TestApi\Model\TestApi" />
Now create a webapi.xml file inside app/code/Webkul/TestApi/etc folder:
<routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Webapi:etc/webapi.xsd">
<route url="/V1/testapi/custom/me" method="GET">
<service class="Webkul\TestApi\Api\TestApiManagementInterface" method="getApiData"/>
<parameter name="id" force="true">%customer_id%</parameter>
the above xml file defines the routes and their permissions.
The route tag attributes:
- attribute url defines the route for the web service
- attribute method defines the request type GET,PUT,POST or DELETE
Now the service tag attributes:
- class attribute is the interface class that defines the api methods.
- service attribute defines the exposed method
now the resource tag defines the access control these can be three level of access:
- Admin : for admin level access you need to define admin resource in the resource tag.
- Customer: for customer level access you need to set self in the resource.
- Guest: for guest level resources you need to define anonymous in the resource tag.
- I have defined self so this resource will work for customer level access.
Originally Published: https://webkul.com/blog/magento2-custom-rest-api/
Comments
Post a Comment