This is a beta release of documentation for Magento 2.4, published for previewing soon-to-be-released functionality. Content in this version is subject to change. Links to the v2.4 code base may not properly resolve until the code is officially released.

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.