route api magento 2 avec paramètre d'entrée

8

J'essaie de créer une route api avec des paramètres d'entrée mais je n'obtiens pas le résultat attendu.

Voici mon 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>

Voici mon interface:

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

Et voici la classe:

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

J'omets le di.xml avec la préférence. Maintenant, si j'appelle cette route, quoi que je fasse, tout ce que je récupère est %id%. Même si je ne mets aucun paramètre, j'obtiens cela au lieu d'une erreur ou de quelque chose.

Qu'est-ce que je fais mal ici?

Voici l'appel en facteur: entrez la description de l'image ici entrez la description de l'image ici

J'ai essayé:

  • envoi d'une demande get
  • envoi d'une requête get avec paramètre /order?id=foo
  • envoi d'une demande de publication
  • envoi d'une demande de publication avec formulaire-données
  • envoyer une demande de publication avec des données brutes (comme on le voit sur la capture d'écran)

Tous ont le même résultat -> %id%

J'utilise l'édition communautaire btw.

Steros
la source
Avez-vous trouvé une solution à son problème? Veuillez me faire savoir que je suis confronté au même problème merci
Purushotam Sharma
Désolé, j'ai quitté l'entreprise et je ne peux plus accéder au code. Je pense que j'ai fait ce que j'ai commencé dans mon dernier commentaire dans la seule réponse.
steros

Réponses:

4

Après avoir vérifié les modules principaux, constaté que le parameternœud dans webapi.xml n'est utilisé que dans le module client pour le selftype de ressource.

Le fichier ci-dessous est responsable de la conversion de l'espace réservé du paramètre avec une valeur.

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

Il existe maintenant deux façons de transmettre des paramètres dans l'API.

Solution 1:

webapi.xml comme ci-dessous:

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

et spécifiez également l' $idargument dans la classe Interface et dans la définition d'implémentation. Dans ce cas, vous devez passer id comme contenu corporel.

Solution 2:

webapi.xml comme ci-dessous:

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

et spécifiez également l' $idargument dans la classe Interface et dans la définition d'implémentation. Dans ce cas, vous devez passer id dans l'URL comme argument. Pour cela, vous pouvez également consulter le module produit.

Pankaj Pareek
la source
Oui, c'est exactement ce que je veux, pour le rendre obligatoire!
steros
Pourquoi downvote .. ne pas obtenir. Comme vous l'avez déclaré Inerface avec Argument. L'argument est déjà requis. Si vous n'ajoutez pas dans webapi.xml. Cela fonctionnera, j'ai essayé cela et cela a bien fonctionné
Pankaj Pareek
Peut-être que ce n'est pas clair? Je veux spécifiquement utiliser l' dataélément dans le webapi.xml. Le laisser de côté donne la sortie attendue mais ne résout pas le problème réel.
steros
Ah, vous m'avez conduit à quelque chose: "* Les paramètres dans le webapi.xml peuvent être forcés. Cela garantit que sur des routes spécifiques, une valeur spécifique est toujours utilisée. * Par exemple, s'il y a un" ... / me / .. . "route, la route doit utiliser uniquement les informations utilisateur spécifiques à * l'utilisateur actuellement connecté. Plus précisément, s'il y avait une route" / customers / me / addresses ", la méthode de service * invoquée pourrait avoir la signature" getAddresses ( $ customerId) ", mais dans le webapi.xml, le paramètre $ customerId * serait obligatoirement l'ID client de l'utilisateur authentifié actuel."
steros
Trouvé dans ParamOverriderInterface.php - Je suis malade en ce moment et j'ai du mal à saisir les choses, mais si je comprends bien dans cet état. Ces données et éléments de paramètre n'ont pas grand-chose à voir avec le paramètre de demande. Au lieu de cela, ils forcent une valeur pour un paramètre (d'où que cela vienne).
steros