Pregunta

Configuré una ruta personalizada funcional para la API REST de Magento.

Funciona bien para solicitudes GET, ya que el _retrieve() función del correspondiente V1.php La clase se llama como se esperaba y devuelve los datos.Pero ahora estoy intentando manejar solicitudes POST y es entonces cuando Magento se comporta de forma extraña:

  • Cuando desee publicar datos, debe definir los datos como una colección en lugar de una entidad en etc/api2.xml como esto: <action_type>collection</action_type>.De lo contrario, Magento arrojará este error Mage_Api2_Model_Resource (línea 207):
// Creation of objects is possible only when working with collection
$this->_critical(self::RESOURCE_METHOD_NOT_IMPLEMENTED);

Entonces, cuando defino action_type como colección, entonces el _multiCreate() función del correspondiente V1.php se llama como se esperaba.

  • Sin embargo, Magento ahora no me permite devolver ningún dato.Quiero devolver esta matriz en formato JSON:

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

'éxito', 'error' y 'modelo' se definen como atributos en api2.xml y, por lo tanto, deberían estar disponibles.Pero cuando regrese $response, la respuesta está vacía con el estado 207 ...¡Mmm!Ahora que tiene una colección action_type, también intenté devolver el $response envuelto dentro de otra matriz, pero sin éxito.

En mis pruebas finales descubrí que al configurar datos con el método $this->getResponse()->addMessage(....) Puedo recuperar datos, pero no creo que esta sea la forma correcta, ya que se cree que es para tipos de mensajes de éxito/error/advertencia y no se ajusta a mis requisitos de tipo de datos.

Por último, pero no menos importante, también intenté devolver datos utilizando el $this->getResponse()->setBody($result) y $this->getResponse()->setRawBody($result) métodos, pero nuevamente, sin éxito:

Entonces, expertos en Magento: ¿Cuál es la forma correcta de recuperar datos de una solicitud POST a la API REST?¡¡Necesito tu ayuda desesperadamente!!

Aquí está mi 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>
¿Fue útil?

Solución

Si echas un vistazo a la clase Mage_Api2_Model_Resource que debería ser extendido por su clase, puede encontrar la función _render().

Mediante el examen dispach() función de esta clase, puedes ver que _render() La función se llama mediante operaciones de recuperación.Entonces puedes usar esta función al final de tu acción así $this->_render($data).

Esta función no la utilizan las operaciones de creación, que solo configuran el encabezado de Ubicación en la URL del recurso recién creado.

Para aprovechar el filtrado de atributos, utilice $this->getFilter()->out($data) antes $this->_render($data)

Mage_Api2_Model_Resource::dispatch() ¡Puede responder muchas preguntas sobre magento REST!

Otros consejos

Logré recuperar datos del _createMulti() funcione siguiendo las sugerencias de @raivis.krumins.Dentro de dispatch() función de la Mage_Api2_Model_Resource clase Agregué estas 3 líneas después de la línea 228 al final del if declaración donde se establece el encabezado de ubicación:

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

La primera línea recupera el resultado de la función, la segunda línea filtra los atributos no deseados (los que no están configurados en api2.xml) y finalmente la tercera línea devuelve los datos de la respuesta.

Tenga en cuenta que estos cambios siempre deben realizarse en un módulo personalizado.¡Nunca cambies una clase principal!

Justo antes de las reposiciones en su conjunto de funciones de módulo personalizado

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top