最近,我一直在通过使用webapi功能引入新的API端点来对Magento 2进行一些自定义。随后引发了关于Magento如何实际处理Webapi中不同响应代码的讨论。我怎样才能触发400、401、500的附加费?因此,我深入了解了更多。
TL; DR; 事实证明,这完全取决于您的代码引发的Exception类型。
在我深入研究异常做什么之前,让我们快速研究一下此逻辑的位置以及如何找到它。
为了追踪这一点,我已经知道所有api调用都要通过/rest/[your-endpoint]
,所以这意味着有一个Controller!该控制器在这里:https : //github.com/magento/magento2/blob/2.3-develop/app/code/Magento/Webapi/Controller/Rest.php
在dispatch
方法内部,您将看到以下try / catch块:
try {
$processor = $this->requestProcessorPool->getProcessor($this->_request);
$processor->process($this->_request);
} catch (\Exception $e) {
$maskedException = $this->_errorProcessor->maskException($e);
$this->_response->setException($maskedException);
}
这里的关键行是catch语句中的两行。这是$maskedException
已处理的背后究竟会在状态码方面,消息到用户的响应返回所有的逻辑。
现在让我们进入错误处理器。可以在这里找到:https : //github.com/magento/magento2/blob/2.3-develop/lib/internal/Magento/Framework/Webapi/ErrorProcessor.php
该maskException
方法包含很多逻辑,可以弄清楚要使用的状态码,以及是否可以向最终用户隐藏原始异常。
本质上可以归结为:
- 如果它是
Magento\Framework\Webapi\Exception
(别名为WebapiException
)的实例,则返回该实例。此Exception类要求您定义要返回的状态码以及其他参数。 - 的实例的
Magento\Framework\Exception\LocalizedException
处理方式略有不同。 NoSuchEntityException
将返回404(不存在)AuthorizationException
否则AuthenticationException
将返回401- a的其他任何实例都是
LocalizedException
400。 - 任何其他异常都将被屏蔽,并向最终用户隐藏。
有了这些信息,您可以看到我们有相当多的灵活性。例如,如果由a的实例返回的错误代码LocalizedException
不符合您的要求,则只需要抛出Magento\Framework\Webapi\Exception
带有所需的所需响应代码的a 。