我使用swagger-codegen为Magento2生成了一个PHP客户端库 . 我错过了一些东西,或者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等多个过滤器 . 这个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参数是一个字符串,实际上它应该是一个对象数组 .