Magento2 Swagger生成的php客户端损坏

时间:2016-04-15 22:03:29

标签: php code-generation swagger magento2 client-library

我使用swagger-codegen为Magento2生成了一个PHP客户端库。我能够连接到Magento并尝试一些方法来查看生成的客户端的可用性。似乎我要么缺少某些东西,要么Magento发布的招摇规格还不够。

特别是,调用各种列表操作似乎被设计边缘化,并且在生成的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 ,多个过滤器时,这些参数只允许每个字段有一个条目em> filter_group 等。great blog post帮助我了解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得到回复。所以我有几个问题

那么JSON Magento是否存在问题,导致生成的Swagger代码出错?或者还有其他一些步骤,我在生成客户端时搞砸了?

感觉好像不对,因为如果你看一下blog article和生成的Swagger文档,Swagger建议 filter_groups 参数是一个字符串,当真的它应该是一个对象数组。

0 个答案:

没有答案