Маршрут magento 2 API с входным параметром

8

Я пытаюсь создать маршрут API с входными параметрами, но я не получаю ожидаемый результат.

Вот мой webapi.xml:

<?xml version="1.0"?>
<routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../app/code/Magento/Webapi/etc/webapi.xsd">
    <route url="/V1/foo" method="POST" secure="true">
        <service class="..\FooInterface"
                 method="getFooById"/>
        <resources>
            <resource ref="anonymous"/>
        </resources>
        <data>
            <parameter name="id" force="true">%id%</parameter>
        </data>
    </route>
</routes>

Вот мой интерфейс:

interface FooInterface
{
    /**
     * Test function
     *
     * @api
     * @param string $id
     * @return string
     */
    public function getFooById($id);
}

И вот класс:

class Foo implements FooInterface
{
    /**
     * {@inheritdoc}
     */
    public function getFooById($id){
        return $id;
    }
}

Я опускаю di.xml с предпочтением. Теперь, если я назову этот маршрут, что бы я ни делал, я получу обратно %id%. Даже если я не введу какой-либо параметр, я получу это вместо ошибки или чего-то еще.

Что я здесь не так делаю?

Вот звонок в почтальоне: введите описание изображения здесь введите описание изображения здесь

Я старался:

  • отправив запрос на получение
  • отправка запроса get с параметром /order?id=foo
  • отправка почтового запроса
  • отправка почтового запроса с данными формы
  • отправка почтового запроса с необработанными данными (как показано на скриншоте)

У всех одинаковый результат -> %id%

Я использую издание сообщества, кстати.

steros
источник
Вы нашли какое-нибудь решение для его проблемы? Пожалуйста, дайте мне знать, что я столкнулся с той же проблемой, спасибо
Пурушотам Шарма
Извините, покинул компанию и больше не могу получить доступ к коду. Я думаю, что сделал то, что начал в своем последнем комментарии в единственном ответе.
стероиды

Ответы:

4

После проверки основных модулей обнаружил, что parameterузел в webapi.xml используется только в модуле клиента для selfтипа ресурса.

Ниже файл отвечает за заполнитель параметра Convert со значением.

/**
 * Replaces a "%customer_id%" value with the real customer id
 */
Magento\Webapi\Controller\Rest\ParamOverriderCustomerId 

Теперь есть два способа передать параметр в API.

Решение 1:

webapi.xml как ниже:

<?xml version="1.0"?>
<routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Webapi:etc/webapi.xsd">
    <route url="/V1/foo" method="POST" secure="true">
        <service class="..\FooInterface" method="getFooById"/>
        <resources>
            <resource ref="anonymous"/>
        </resources>
    </route>
</routes>

и укажите $idаргумент в классе интерфейса, а также в определении реализации. В этом случае вам нужно передать id в качестве содержимого тела.

Решение 2:

webapi.xml как ниже:

<?xml version="1.0"?>
<routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Webapi:etc/webapi.xsd">
    <route url="/V1/foo:id" method="POST" secure="true">
        <service class="..\FooInterface" method="getFooById"/>
        <resources>
            <resource ref="anonymous"/>
        </resources>
    </route>
</routes>

и укажите $idаргумент в классе интерфейса, а также в определении реализации. В этом случае вам нужно передать идентификатор в URL в качестве аргумента. Для этого вы также можете проверить модуль продукта.

Панкай Парик
источник
Да, это именно то, что я хочу, чтобы сделать это требуется!
стеро
Почему понизить .. не получаю. Как вы заявили Inerface с Аргументом. Аргумент уже требуется. Если вы не добавите в webapi.xml. Это будет работать, я попробовал это, и это работало отлично
Pankaj Pareek
Может это не понятно? Я специально хочу использовать dataэлемент в webapi.xml. Простое исключение дает ожидаемый результат, но не решает актуальную проблему.
Стерос
Ах, вы привели меня к чему-то: "* Параметры в файле webapi.xml могут быть принудительными. Это гарантирует, что на определенных маршрутах всегда используется определенное значение. * Например, если есть" ... / me / .. . "route, маршрут должен использовать только пользовательскую информацию, относящуюся к * вошедшему в данный момент пользователю. Более конкретно, если был маршрут" / Customers / me / address ", вызываемый метод обслуживания * может иметь подпись" getAddresses ( $ customerId) ", но в файле webapi.xml параметр $ customerId * будет вынужден быть идентификатором клиента текущего аутентифицированного пользователя."
стеро
Находится в ParamOverriderInterface.php - я болен в данный момент, и у меня проблемы с пониманием, но если я правильно понял в этом состоянии. Эти данные и элементы параметров не имеют ничего общего с параметром запроса. Вместо этого они вынуждают значение параметра (откуда бы оно ни исходило).
стеро