percorso api magento 2 con parametro di input


8

Sto cercando di creare un percorso API con parametri di input ma non sto ottenendo il risultato previsto.

Ecco il mio 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>

Ecco la mia interfaccia:

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

E qui la classe:

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

Ometto il di.xml con la preferenza. Ora, se chiamo quella strada, qualunque cosa io faccia, tutto ciò che torno è %id%. Anche se non inserisco alcun parametro, lo ottengo invece di un errore o qualcosa del genere.

Cosa sto facendo di sbagliato qui?

Ecco la chiamata in postino: inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine

Provai:

  • invio di una richiesta get
  • invio di una richiesta get con parametro /order?id=foo
  • invio di una richiesta di posta
  • invio di una richiesta di posta con i dati del modulo
  • invio di una richiesta di post con dati non elaborati (come mostrato nello screenshot)

Tutti hanno lo stesso risultato -> %id%

Sto usando l'edizione della community a proposito.


Hai trovato una soluzione per il suo problema? Per favore fatemi sapere che sto affrontando lo stesso problema grazie
Purushotam Sharma,

Siamo spiacenti di aver lasciato l'azienda e di non poter più accedere al codice. Penso di aver fatto quello che ho iniziato nel mio ultimo commento nell'unica risposta.
steros,

Risposte:


4

Dopo aver controllato i moduli principali, parameterho scoperto che il nodo in webapi.xml è usato solo nel modulo cliente per il selftipo di risorsa.

Il file di seguito è responsabile del parametro Converti segnaposto con valore.

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

Ora ci sono due modi per passare i parametri nell'API.

Soluzione 1:

webapi.xml come sotto:

<?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 specificare l' $idargomento nella classe Interface e anche nella definizione dell'implementazione. In questo caso, devi passare l'ID come contenuto del corpo.

Soluzione 2:

webapi.xml come sotto:

<?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 specificare l' $idargomento nella classe Interface e anche nella definizione dell'implementazione. In questo caso, devi passare l'id nell'URL come argomento. Per questo è possibile controllare anche il modulo del prodotto.


Sì, è esattamente quello che voglio, per renderlo necessario!
steros,

Perché downvote .. non ottenere. Come hai dichiarato Inerface con Argument. L'argomento è già richiesto. Se non si aggiungerà in webapi.xml. Funzionerà, l'ho provato e ha funzionato bene
Pankaj Pareek,

Forse non è chiaro? In particolare, voglio utilizzare l' dataelemento in webapi.xml. Tralasciandolo si ottiene l'output previsto ma non si risolve il problema reale.
steros,

Ah mi hai portato a qualcosa: "* I parametri in webapi.xml possono essere forzati. Questo assicura che su percorsi specifici, venga sempre usato un valore specifico. * Ad esempio, se c'è un" ... / me / .. . "route, la route dovrebbe utilizzare solo le informazioni utente specifiche dell'utente * attualmente connesso. Più specificamente, se esistesse una route" / customers / me / address ", il metodo di servizio * invocato potrebbe avere una firma di" getAddresses ( $ customerId) ", ma in webapi.xml, il parametro $ customerId * sarebbe costretto a essere l'ID cliente dell'utente autenticato corrente."
steros,

Trovato in ParamOverriderInterface.php - Al momento sono malato e ho difficoltà a cogliere le cose, ma se lo capisco proprio in questo stato. Tali dati ed elementi di parametro non hanno molto a che fare con il parametro request. Invece forzano un valore per un parametro (da qualunque parte provenga).
steros,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.