Question

J'ai mis en place une route personnalisée fonctionnelle pour l'API REST de Magento.

Cela fonctionne bien pour les requêtes GET, car _retrieve() fonction du correspondant V1.php la classe est appelée comme prévu et renvoie les données.Mais maintenant j'essaie de gérer les requêtes POST et c'est à ce moment-là que Magento se comporte bizarrement :

  • Lorsque vous souhaitez publier des données, vous devez définir les données comme une collection plutôt que comme une entité dans etc/api2.xml comme ça: <action_type>collection</action_type>.Sinon, Magento générera cette erreur Mage_Api2_Model_Resource (ligne 207):
// Creation of objects is possible only when working with collection
$this->_critical(self::RESOURCE_METHOD_NOT_IMPLEMENTED);

Ainsi, lorsque je définis le type d'action comme collection, alors le _multiCreate() fonction du correspondant V1.php est appelé comme prévu.

  • Cependant, Magento ne me permet plus de renvoyer aucune donnée.Je souhaite renvoyer ce tableau au format JSON :

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

« succès », « erreur » et « modèle » sont définis comme des attributs dans le fichier api2.xml et doivent donc être disponibles.Mais quand je reviens $response, la réponse est vide avec le statut 207 ...Hmmm!Maintenant qu'il a la collection action_type, j'ai également essayé de renvoyer le $response enveloppé dans un autre tableau, mais sans succès.

Lors de mes derniers essais, j'ai compris qu'en définissant les données avec la méthode $this->getResponse()->addMessage(....) Je suis capable de récupérer des données, mais je ne pense pas que ce soit la bonne méthode, car on pense que c'est le cas pour les types de messages de réussite/erreur/avertissement et cela ne répond pas à mes exigences en matière de type de données.

Enfin et surtout, j'ai également essayé de renvoyer des données en utilisant le $this->getResponse()->setBody($result) et $this->getResponse()->setRawBody($result) méthodes, mais encore une fois - sans succès :

Alors experts Magento - Quelle est la bonne façon de récupérer les données d'une requête POST vers l'API REST ?J'ai désespérément besoin de votre aide !!

Voici mon 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>
Était-ce utile?

La solution

Si tu regardes la classe Mage_Api2_Model_Resource qui devrait être étendu par votre classe, vous pouvez trouver la fonction _render().

En examinant dispach() fonction de cette classe, vous pouvez voir que _render() la fonction est appelée par des opérations de récupération.Vous pouvez donc utiliser cette fonction à la fin de votre action comme ceci $this->_render($data).

Cette fonction n'est pas utilisée par les opérations de création, qui définissent uniquement l'en-tête Location sur l'URL de la ressource nouvellement créée.

Pour profiter du filtrage des attributs, utilisez $this->getFilter()->out($data) avant $this->_render($data)

Mage_Api2_Model_Resource::dispatch() peut répondre à de nombreuses questions concernant magento REST !

Autres conseils

J'ai réussi à récupérer les données du _createMulti() fonction en suivant les suggestions de @raivis.krumins.À l'intérieur de dispatch() fonction du Mage_Api2_Model_Resource classe j'ai ajouté ces 3 lignes après la ligne 228 à la fin du if instruction où l'en-tête d'emplacement est défini :

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

La première ligne récupère le résultat de la fonction, la deuxième ligne filtre les attributs indésirables (ceux non définis dans api2.xml) et enfin la troisième ligne renvoie les données dans la réponse.

Veuillez noter que ces modifications doivent toujours être effectuées dans un module personnalisé.Ne changez jamais une classe principale !

Juste avant les réexécutions dans votre ensemble de fonctions de module personnalisé

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top