Orocommerce - 对产品和类别的经过身份验证的 GET 请求失败

问题描述

我在通过 Postman 和 curl 向 /api/products/api/categories 发出经过身份验证的 GET 请求时遇到 500 错误。 API 请求是:

curl -X GET \
  'http://HOST-IP/api/products?page[number]=1&page[size]=10&sort=id' \
  -H 'Accept: application/vnd.api+json' \
  -H 'Authorization: Bearer XXX' \
  -H 'Content-Type: application/vnd.api+json'

从 prod.log 中,/api/products输出是:

api.ERROR: The execution of "oro_api.load_entities_by_entity_serializer" processor is Failed. 
{"exception":"[object] (ErrorException(code: 0): Call to a member function getId() on null 
at /var/www/html/commerce/vendor/oro/commerce/src/Oro/Bundle/RedirectBundle/Api/Processor/ComputeUrlFields.PHP:83)","action":"get_list","requestType":"rest,json_api,frontend","version":"latest","class":"Oro\\Bundle\\ProductBundle\\Entity\\Product"} []

检查 ComputeUrlFields.PHP 的第 83 行,引用了 LocalizationHelper,它存在于:/var/www/html/commerce/vendor/oro/platform/src/Oro/Bundle/LocaleBundle/Helper

这些 API 通过沙盒成功运行。此外,我还可以发出其他经过身份验证的 API 请求,例如 GET /api/productimages/api/productfamilies。对失败有什么想法吗?我没有更改 AWS Marketplace 映像中的任何捆绑包。

电子商务版本:4.2.1

当前本地化设置:

enter image description here

解决方法

您的环境或管理设置似乎有问题。

我们尝试在干净的 AWS 实例上重现问题,但没有成功。 另外,请注意,没有“/api/categories”资源,但有“/api/mastercatalogcategories”可以与您的重现步骤没有问题,与“/api/products”相同。

根据堆栈跟踪,本地化检测或默认本地化配置有问题。见https://doc.oroinc.com/user/back-office/system/configuration/system/general-setup/global-localization/

我建议使用 xDebug 来查找根本原因,或者作为一种解决方法,您可以使用 X-Localization-ID 标头显式设置本地化。