Frage

Ich habe eine funktionierende benutzerdefinierte Route für die REST-API von Magento eingerichtet.

Es funktioniert gut für GET-Anfragen, da _retrieve() Funktion des entsprechenden V1.php Die Klasse wird wie erwartet aufgerufen und gibt die Daten zurück.Aber jetzt versuche ich, POST-Anfragen zu verarbeiten, und dann verhält sich Magento seltsam:

  • Wenn Sie Daten veröffentlichen möchten, müssen Sie die Daten als Sammlung und nicht als Entität definieren etc/api2.xml so was: <action_type>collection</action_type>.Andernfalls gibt Magento diesen Fehler aus Mage_Api2_Model_Resource (Zeile 207):
// Creation of objects is possible only when working with collection
$this->_critical(self::RESOURCE_METHOD_NOT_IMPLEMENTED);

Wenn ich also den Aktionstyp als Sammlung definiere, dann wird der _multiCreate() Funktion des entsprechenden V1.php wird wie erwartet aufgerufen.

  • Allerdings lässt mich Magento jetzt keine Daten zurückgeben.Ich möchte dieses Array im JSON-Format zurückgeben:

    $response = array("success"=>true, "error"=>"", "model"=>array(1,2,3));

„success“, „error“ und „model“ sind als Attribute in der api2.xml definiert und sollten daher verfügbar sein.Aber wenn ich zurückkomme $response, Die Antwort ist mit Status 207 leer ...Hmmm!Da es nun eine action_type-Sammlung gibt, habe ich auch versucht, die zurückzugeben $response in ein anderes Array eingeschlossen, aber ohne Erfolg.

Bei meinen letzten Versuchen habe ich das herausgefunden, indem ich Daten mit der Methode festgelegt habe $this->getResponse()->addMessage(....) Ich kann Daten abrufen, aber ich glaube nicht, dass dies der richtige Weg ist, da er für Erfolgs-/Fehler-/Warnungsmeldungstypen gedacht ist und nicht meinen Datentypanforderungen entspricht.

Zu guter Letzt habe ich auch versucht, Daten mithilfe von zurückzugeben $this->getResponse()->setBody($result) Und $this->getResponse()->setRawBody($result) Methoden, aber auch hier - kein Erfolg:

Also Magento-Experten: Was ist der richtige Weg, um Daten aus einer POST-Anfrage an die REST-API abzurufen?Ich brauche dringend eure Hilfe!!

Hier ist meins api2.xml:

<customer_login translate="title" module="Test_Restapi">
    <group>restapi</group>
    <model>restapi/api2_customer_login</model>
    <title>Blablabla</title>
    <sort_order>10</sort_order>
    <privileges>
        <customer>
            <create>1</create>
            <update>1</update>
            <retrieve>1</retrieve>
        </customer>
        <guest>
            <create>1</create>
            <update>1</update>
            <retrieve>1</retrieve>
        </guest>
    </privileges>
    <attributes>
        <success>Success</success>
        <error>Error</error>
        <model>Model</model>
    </attributes>
    <routes>
        <route_collection>
            <route>/restapi/customer/login</route>
            <action_type>collection</action_type>
        </route_collection>
    </routes>
    <versions>1</versions>
</customer_login>
War es hilfreich?

Lösung

Wenn Sie einen Blick auf die Klasse werfen Mage_Api2_Model_Resource welche von Ihrer Klasse erweitert werden soll, finden Sie in der Funktion _render().

Durch Untersuchen dispach() Funktion dieser Klasse, das können Sie sehen _render() Die Funktion wird durch Abrufvorgänge aufgerufen.Sie können diese Funktion also am Ende Ihrer Aktion nutzen $this->_render($data).

Diese Funktion wird nicht von Erstellungsvorgängen verwendet, die nur den Standort-Header auf die neu erstellte Ressourcen-URL setzen.

Um die Vorteile der Attributfilterung zu nutzen, verwenden Sie $this->getFilter()->out($data) Vor $this->_render($data)

Mage_Api2_Model_Resource::dispatch() kann viele Fragen zu Magento REST beantworten!

Andere Tipps

Es ist mir gelungen, Daten aus dem abzurufen _createMulti() Funktion, indem Sie den Vorschlägen von @raivis.krumins folgen.Im Inneren dispatch() Funktion der Mage_Api2_Model_Resource Klasse habe ich diese 3 Zeilen nach Zeile 228 am Ende der hinzugefügt if Anweisung, in der der Location-Header gesetzt wird:

$retrievedData = $this->_createMulti($filteredData);
$returnData  = $this->getFilter()->out($retrievedData);
$this->_render($returnData);

Die erste Zeile ruft das Ergebnis der Funktion ab, die zweite Zeile filtert unerwünschte Attribute (die nicht festgelegt sind). api2.xml) und schließlich gibt die dritte Zeile die Daten in der Antwort zurück.

Bitte beachten Sie, dass diese Änderungen immer in einem benutzerdefinierten Modul vorgenommen werden sollten.Ändern Sie niemals eine Kernklasse!

Kurz vor Wiederholungen in Ihrem benutzerdefinierten Modulfunktionssatz

$this->getResponse()->appendBody(json_encode($response));

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit magento.stackexchange
scroll top