0

我已经使用swagger- codegen 为 Magento2 生成了一个 PHP 客户端库。我能够连接到 Magento 并尝试一些方法来查看生成的客户端的可用性。似乎我要么遗漏了一些东西,要么 Magento 发布的 swagger 规范还没有完全到位。

特别是,调用各种列表操作似乎在设计上被边缘化,并且在生成的 swagger 客户端中被自然破坏。以列出产品的操作为例,/V1/products。Swagger UI 表明这可以使用 GET 参数进行参数化(实际上您似乎必须 - 当我尝试不带参数调用它时 Magento 返回 HTTP 400)。这是从与客户端库一起生成的 Markdown Swagger 生成的示例代码

try { 
    $result = $api_instance->catalogProductRepositoryV1GetListGet(
        $search_criteria_filter_groups_filters_field, 
        $search_criteria_filter_groups_filters_value, 
        $search_criteria_filter_groups_filters_condition_type, 
        $search_criteria_sort_orders_field,  
        $search_criteria_sort_orders_direction, $search_criteria_page_size, 
        $search_criteria_current_page);
    print_r($result);
} catch (Exception $e) {
    echo
        'Exception when calling CatalogProductRepositoryVApi->catalogProductRepositoryV1GetListGet: ',
        $e->getMessage(), "\n";
}

我注意到的第一件事是这些参数只允许为每个字段输入一个条目,而 API 实际上允许您定义多个filter_groups、每个filter_group多个过滤器等。这篇很棒的博客文章帮助我了解了 API应该如何工作。

不过退一步,假设一个filter_group的限制和该组的一个过滤器是可以接受的,并且只是尝试使用生成的客户端,我尝试组织一个简单的调用

// Fetch all products with a contrived like query
$oMageClient = new Swagger\Client\Api\CatalogProductRepositoryVApi($oApiClient);
$result      = $oMageClient->catalogProductRepositoryV1GetListGet('name', '%', 'like');

Magento 抱怨 HTTP 400,这是因为生成的客户端的请求参数:

searchCriteria[filterGroups][][filters][][field]=name&searchCriteria[filterGroups][][filters][][value]=%&searchCriteria[filterGroups][][filters][][conditionType]=like

它所做的是将参数分解为不同的filter_groups ... 果然,当我查看生成的Swagger\Client\Api\CatalogProductRepositoryVApi:: catalogProductRepositoryV1GetListGetWithHttpInfo方法时,我找到了设置查询参数的罪魁祸首。通过改变

// query params
if ($search_criteria_filter_groups_filters_field !== null) {
    $queryParams['searchCriteria[filterGroups][][filters][][field]'] = $this->apiClient->getSerializer()->toQueryValue($search_criteria_filter_groups_filters_field);
}// query params
if ($search_criteria_filter_groups_filters_value !== null) {
    $queryParams['searchCriteria[filterGroups][][filters][][value]'] = $this->apiClient->getSerializer()->toQueryValue($search_criteria_filter_groups_filters_value);
}// query params
if ($search_criteria_filter_groups_filters_condition_type !== null) {
    $queryParams['searchCriteria[filterGroups][][filters][][conditionType]'] = $this->apiClient->getSerializer()->toQueryValue($search_criteria_filter_groups_filters_condition_type);
}

// query params
if ($search_criteria_filter_groups_filters_field !== null) {
    $queryParams['searchCriteria[filterGroups][0][filters][0][field]'] = $this->apiClient->getSerializer()->toQueryValue($search_criteria_filter_groups_filters_field);
}// query params
if ($search_criteria_filter_groups_filters_value !== null) {
    $queryParams['searchCriteria[filterGroups][0][filters][0][value]'] = $this->apiClient->getSerializer()->toQueryValue($search_criteria_filter_groups_filters_value);
}// query params
if ($search_criteria_filter_groups_filters_condition_type !== null) {
    $queryParams['searchCriteria[filterGroups][0][filters][0][conditionType]'] = $this->apiClient->getSerializer()->toQueryValue($search_criteria_filter_groups_filters_condition_type);
}

我能够得到 Magento 的回复。所以我有几个问题

那么,Magento 发布的 JSON 是否存在问题,导致生成的 Swagger 代码出现错误?还是我在生成客户端时搞砸了其他步骤?

感觉有些不对劲,因为如果您查看博客文章和生成的 Swagger 文档,Swagger 建议filter_groups参数是一个字符串,而实际上它应该是一个对象数组。

4

0 回答 0