rota magi 2 api com parâmetro de entrada

8

Estou tentando criar uma rota API com parâmetros de entrada, mas não estou obtendo o resultado esperado.

Aqui está o meu 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>

Aqui está minha interface:

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

E aqui a turma:

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

Estou omitindo o di.xml com a preferência. Agora, se eu chamar essa rota de tudo o que faço, tudo o que recebo é %id%. Mesmo se eu não colocar nenhum parâmetro, entendo isso em vez de um erro ou algo assim.

O que eu estou fazendo errado aqui?

Aqui está a chamada no carteiro: insira a descrição da imagem aqui insira a descrição da imagem aqui

Eu tentei:

  • enviando uma solicitação get
  • enviando uma solicitação get com o parâmetro /order?id=foo
  • enviando uma solicitação de postagem
  • enviando uma solicitação de postagem com dados do formulário
  • enviando uma solicitação de postagem com dados brutos (como visto na captura de tela)

Todos têm o mesmo resultado -> %id%

Estou usando o Community Edition btw.

steros
fonte
Você encontrou alguma solução para o problema dele? Por favor, deixe-me saber que estou enfrentando mesmas problema graças
Purushotam Sharma
Desculpe deixar a empresa e não pode mais acessar o código. Eu acho que fiz o que comecei no meu último comentário na única resposta.
steros

Respostas:

4

Após verificar os módulos principais, constatou que o parameternó no webapi.xml é usado apenas no módulo do cliente para o selftipo de recurso.

O arquivo abaixo é responsável por Converter o espaço reservado do parâmetro com valor.

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

Agora, existem duas maneiras de passar parâmetros na API.

Solução 1:

webapi.xml como abaixo:

<?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>

e especifique $idargumento na classe Interface e também na definição de implementação. Nesse caso, você precisa passar a ID como conteúdo do corpo.

Solução 2:

webapi.xml como abaixo:

<?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>

e especifique $idargumento na classe Interface e também na definição de implementação. Nesse caso, você precisa passar o ID na URL como argumento. Para isso, você também pode verificar o módulo do produto.

Pankaj Pareek
fonte
Sim, é exatamente isso que eu quero, para torná-lo necessário!
steros
Por que voto negativo .. não recebendo. Como você declarou Inerface with Argument. O argumento já é necessário. Se você não incluir o webapi.xml. Ele vai trabalhar, eu tentei isso e ele funcionou bem
Pankaj Pareek
Talvez não esteja claro? Eu quero especificamente usar o dataelemento no webapi.xml. Apenas deixar de fora fornece a saída esperada, mas não resolve o problema real.
steros
Ah, você me levou a algo: "* Os parâmetros no webapi.xml podem ser forçados. Isso garante que, em rotas específicas, sempre seja usado um valor específico. * Por exemplo, se houver um" ... / me / .. . ", a rota deve usar apenas informações específicas do usuário * atualmente conectado. $ customerId) ", mas no webapi.xml, o parâmetro $ customerId * seria forçado a ser o ID do cliente do usuário autenticado atual."
steros
Encontrado em ParamOverriderInterface.php - Estou doente no momento e tenho problemas para entender as coisas, mas se eu acertar nesse estado. Esses dados e elementos de parâmetro não têm muito a ver com o parâmetro request. Em vez disso, eles forçam um valor para um parâmetro (de onde quer que isso venha).
steros