ruta magento 2 api con parámetro de entrada

8

Estoy tratando de crear una ruta api con parámetros de entrada pero no obtengo el resultado esperado.

Aquí está mi 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>

Aquí mi interfaz:

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

Y aquí la clase:

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

Estoy omitiendo el di.xml con la preferencia. Ahora, si llamo a esa ruta, sea lo que sea que haga, todo lo que regreso es %id%. Incluso si no pongo ningún parámetro, obtengo eso en lugar de un error o algo así.

¿Qué estoy haciendo mal aquí?

Aquí está la llamada en cartero: ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

Lo intenté:

  • enviando una solicitud de obtención
  • enviando una solicitud get con parámetro /order?id=foo
  • enviando una solicitud de publicación
  • Enviar una solicitud de publicación con datos de formulario
  • Enviar una solicitud de publicación con datos sin procesar (como se ve en la captura de pantalla)

Todos tienen el mismo resultado -> %id%

Estoy usando la edición comunitaria por cierto.

esteros
fuente
¿Has encontrado alguna solución para su problema? Por favor, hágame saber que estoy enfrentando el mismo problema, gracias
Purushotam Sharma
Lo siento, dejó la empresa y ya no puedo acceder al código. Creo que hice lo que comencé en mi último comentario en la única respuesta.
steros

Respuestas:

4

Después de verificar los módulos principales, descubrió que el parameternodo en webapi.xml solo se usa en el Módulo del cliente para el selftipo de recurso.

El archivo a continuación es responsable de Convertir el marcador de posición de parámetro con valor.

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

Ahora hay dos formas de pasar parámetros en API.

Solución 1:

webapi.xml como abajo:

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

y especifique el $idargumento en la clase de interfaz y en la definición de implementación también. En este caso, debe pasar la identificación como contenido del cuerpo.

Solución 2:

webapi.xml como abajo:

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

y especifique el $idargumento en la clase de interfaz y en la definición de implementación también. En este caso, debe pasar la identificación en la URL como argumento. Para esto puede consultar el módulo del producto también.

Pankaj Pareek
fuente
Sí, eso es exactamente lo que quiero, ¡para que sea necesario!
steros
¿Por qué rechazar ... no conseguir? Como declaraste Inerface con argumento. El argumento ya es obligatorio. Si no va a agregar webapi.xml. Funcionará, probé esto y funcionó bien
Pankaj Pareek
Tal vez no está claro? Específicamente quiero usar el dataelemento en webapi.xml. Solo dejarlo afuera da el resultado esperado pero no resuelve el problema real.
steros
Ah, me condujo a algo: "* Los parámetros en webapi.xml se pueden forzar. Esto garantiza que en rutas específicas, siempre se use un valor específico. * Por ejemplo, si hay un" ... / me / .. . ", la ruta debe usar solo información del usuario específica para el * usuario actualmente conectado. Más específicamente, si hubiera una ruta" / clients / me / direcciones ", el método de servicio * invocado podría tener una firma de" getAddresses ( $ customerId) ", pero en webapi.xml, el parámetro $ customerId * se vería obligado a ser la identificación del cliente del usuario autenticado actual".
steros
Encontrado en ParamOverriderInterface.php: estoy enfermo en este momento y tengo problemas para comprender las cosas, pero si lo hago bien en este estado. Esos datos y elementos de parámetros no tienen mucho que ver con el parámetro de solicitud. En su lugar, fuerzan un valor para un parámetro (de donde sea que provenga).
steros