Magento 2 API Route mit Eingabeparameter

8

Ich versuche, eine API-Route mit Eingabeparametern zu erstellen, erhalte jedoch nicht das erwartete Ergebnis.

Hier ist meine 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>

Hier meine Schnittstelle:

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

Und hier die Klasse:

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

Ich lasse die di.xml mit der Präferenz weg. Wenn ich diese Route nenne, was auch immer ich tue, bekomme ich nur zurück %id%. Selbst wenn ich keinen Parameter eingebe, bekomme ich diesen anstelle eines Fehlers oder so.

Was mache ich hier falsch?

Hier ist der Anruf beim Postboten: Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein

Ich habe es versucht:

  • Senden einer Get-Anfrage
  • Senden einer Get-Anfrage mit Parameter /order?id=foo
  • Senden einer Post-Anfrage
  • Senden einer Postanfrage mit Formulardaten
  • Senden einer Post-Anfrage mit Rohdaten (siehe Screenshot)

Alle haben das gleiche Ergebnis -> %id%

Ich benutze übrigens die Community Edition.

Steros
quelle
Haben Sie eine Lösung für sein Problem gefunden? Bitte lassen Sie mich wissen, dass ich vor dem gleichen Problem stehe, danke
Purushotam Sharma
Sorry hat das Unternehmen verlassen und kann nicht mehr auf den Code zugreifen. Ich glaube, ich habe das getan, was ich in meinem letzten Kommentar in der einzigen Antwort begonnen habe.
Steros

Antworten:

4

Nach Überprüfung der Kernmodule wurde festgestellt, dass der parameterKnoten in webapi.xml nur im Kundenmodul für den selfRessourcentyp verwendet wird.

Die folgende Datei ist für das Konvertieren des Parameterplatzhalters mit dem Wert verantwortlich.

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

Jetzt gibt es zwei Möglichkeiten, Parameter in der API zu übergeben.

Lösung 1:

webapi.xml Wie unten:

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

und geben Sie das $idArgument auch in der Interface-Klasse und in der Implementierungsdefinition an. In diesem Fall müssen Sie die ID als Textinhalt übergeben.

Lösung 2:

webapi.xml Wie unten:

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

und geben Sie das $idArgument auch in der Interface-Klasse und in der Implementierungsdefinition an. In diesem Fall müssen Sie die ID in der URL als Argument übergeben. Hierzu können Sie auch das Produktmodul überprüfen.

Pankaj Pareek
quelle
Ja, genau das will ich, um es erforderlich zu machen!
Steros
Warum abstimmen .. nicht bekommen. Wie Sie Inerface mit Argument deklariert haben. Argument ist bereits erforderlich. Wenn Sie nicht in webapi.xml hinzufügen. Es wird funktionieren, ich habe es versucht und es hat gut funktioniert
Pankaj Pareek
Vielleicht ist es nicht klar? Ich möchte das dataElement speziell in der Datei webapi.xml verwenden. Wenn Sie es einfach weglassen, erhalten Sie die erwartete Ausgabe, aber das eigentliche Problem wird nicht gelöst.
Steros
Ah, Sie haben mich zu etwas geführt: "* Parameter in der Datei webapi.xml können erzwungen werden. Dadurch wird sichergestellt, dass auf bestimmten Routen immer ein bestimmter Wert verwendet wird. * Zum Beispiel, wenn ein" ... / me / .. . "route, die Route sollte nur Benutzerinformationen verwenden, die für den * aktuell angemeldeten Benutzer spezifisch sind. Insbesondere wenn die Route" / customers / me / address "vorhanden ist, kann die aufgerufene Dienstmethode * die Signatur" getAddresses ( $ customerId) ", aber in der webapi.xml muss der Parameter $ customerId * die Kunden-ID des aktuell authentifizierten Benutzers sein."
Steros
Gefunden in ParamOverriderInterface.php - Ich bin im Moment krank und habe Probleme, Dinge zu erfassen, aber wenn ich es in diesem Zustand richtig mache. Diese Daten- und Parameterelemente haben nicht viel mit dem Anforderungsparameter zu tun. Stattdessen erzwingen sie einen Wert für einen Parameter (woher auch immer dieser kommt).
Steros