генерация кода — Magento2 Swagger сломал php клиент

Я сгенерировал клиентскую библиотеку PHP для Magento2, используя чванство-Codegen. Я могу подключиться к Magento и просто попробовать некоторые методы, чтобы увидеть, насколько сгенерированный клиент можно использовать. Похоже, что я либо что-то упустил, либо, возможно, спецификация чванства, опубликованная Magento, еще не совсем готова.

В частности, вызов различных операций со списками, по-видимому, отодвинут на заданный план и нарушен по своей природе в сгенерированном клиенте swagger. Возьмите, например, операцию для перечисления продуктов, / V1 / продукты. 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. Итак, у меня есть пара вопросов

Так есть ли проблема с публикацией JSON Magento, из-за которой сгенерированный код Swagger глючит? Или есть какой-то другой шаг, который я испортил при создании клиента?

Такое чувство, что что-то не так, потому что если вы посмотрите на статья в блоге и сгенерированная документация Swagger, Swagger предлагает filter_groups Параметр является строкой, когда на самом деле это должен быть массив объектов.

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …