WebApi request processors pool

The request processors pool routes WebApi requests. It is located in the Magento_WebApi module: Magento\Webapi\Controller\Rest\RequestProcessorPool

Magento defines the following processors:

Processor name Class URL pattern Description
sync Magento\Webapi\Controller\Rest\SynchronousRequestProcessor /^\\/V\\d+/ Executes the corresponding service contract.
syncSchema Magento\Webapi\Controller\Rest\SchemaRequestProcessor schema Delivers the schema needed for generating Swagger documentation.
async Magento\WebapiAsync\Controller\Rest\AsynchronousRequestProcessor /^\\/async(\\/V.+)/ Performs an asynchronous API request. It executes Magento\AsynchronousOperations\Model\MassSchedule::publishMass, which places a single message in the queue.
asyncSchema Magento\WebapiAsync\Controller\Rest\AsynchronousSchemaRequestProcessor async/schema Delivers the schema needed for generating Swagger documentation for asynchronous endpoints.
asyncBulk Magento\WebapiAsync\Controller\Rest\VirtualType\AsynchronousBulkRequestProcessor /^\\/async\/bulk(\\/V.+)/ Performs a bulk API request by executing Magento\AsynchronousOperations\Model\MassSchedule::publishMass, which places multiple messages in the queue.
asyncBulkSchema Magento\WebapiAsync\Controller\Rest\VirtualType\AsynchronousBulkSchemaRequestProcessor async/bulk/schema Currently not used. Reserved for future use.

async and asyncBulk share the same processor but have different URL patterns.

Create a new processor

To create a custom processor, you must perform the following tasks:

  • Define the custom processor in webapi_rest/di.xml.
  • Create a processor class and implement the Magento\Webapi\Controller\Rest\RequestProcessorInterface interface.
  • Define the processing rules in the canProcess method.
  • Create the processor logic in the process method.

Define the custom processor

Processors must be defined in a module’s webapi_rest/di.xml file. The following example shows the definition of the default sync processor:

1
2
3
4
5
6
7
<type name="Magento\Webapi\Controller\Rest\RequestProcessorPool">
    <arguments>
        <argument name="requestProcessors" xsi:type="array">
            <item name="sync" xsi:type="object" sortOrder="100">Magento\Webapi\Controller\Rest\SynchronousRequestProcessor</item>
        </argument>
    </arguments>
</type>

Create the processor class

A custom processor must implement the Magento\Webapi\Controller\Rest\RequestProcessorInterface interface, as shown below:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?php
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */
declare(strict_types=1);

namespace Magento\Webapi\Controller\Rest;

/**
 *  Request processor interface
 */
interface RequestProcessorInterface
{
    /**
     * Executes the logic to process the request
     *
     * @param \Magento\Framework\Webapi\Rest\Request $request
     * @return void
     * @throws \Magento\Framework\Exception\AuthorizationException
     * @throws \Magento\Framework\Exception\InputException
     * @throws \Magento\Framework\Webapi\Exception
     */
    public function process(\Magento\Framework\Webapi\Rest\Request $request);

    /**
     * Method should return true for all the requests the current processor can process.
     *
     * Invoked in the loop for all registered request processors. The first one wins.
     *
     * @param \Magento\Framework\Webapi\Rest\Request $request
     * @return bool
     */
    public function canProcess(\Magento\Framework\Webapi\Rest\Request $request);
}

The canProcess(\Magento\Framework\Webapi\Rest\Request $request) method defines whether the current request can be processed. Currently, all implemented processors match current request URLs with the defined patterns.

For example, Magento\WebapiAsync\Controller\Rest\AsynchronousRequestProcessor processes asynchronous calls, such as <host>/rest/async/V1/products.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const PROCESSOR_PATH = "/^\\/async(\\/V.+)/";

.....

public function canProcess(\Magento\Framework\Webapi\Rest\Request $request)
{
    if ($request->getHttpMethod() === \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET) {
        return false;
    }

    if (preg_match($this->processorPath, $request->getPathInfo()) === 1) {
        return true;
    }
    return false;
}

.....

The process(\Magento\Framework\Webapi\Rest\Request $request) method executes processor logic.