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:
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.
Respostas:
Após verificar os módulos principais, constatou que o
parameter
nó no webapi.xml é usado apenas no módulo do cliente para oself
tipo de recurso.O arquivo abaixo é responsável por Converter o espaço reservado do parâmetro com valor.
Agora, existem duas maneiras de passar parâmetros na API.
Solução 1:
webapi.xml
como abaixo:e especifique
$id
argumento 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:e especifique
$id
argumento 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.fonte
data
elemento no webapi.xml. Apenas deixar de fora fornece a saída esperada, mas não resolve o problema real.