Responder las peticiones REST en formato JSON en magento

Magento cuenta con una serie de funciones definidas en un api para realizar consultas sobre la tienda a traves de un webservices por ejemplo listar las imágenes de un producto. Para esto  podriamos hacer una peticion rest a la siguiente url  http://mitiendaMagento.com/api/rest/products/429/images donde 429 es el id de nuestro producto, esto nos regresa normalmente una estrcutura xml. Para generar las respuestas en el formato json solo debemos crear un modulo para reescribir el metodo que define la respuesta de la petición en magento.

Importante por ningun motivo debemos modificar el código del core de la aplicación, la clase que debemos re escribir es la siguiente Mage_Api2_Model_Request el metodo en cuestión seria getAcceptTypes la ruta de la clase es; app/code/core/Mage/Api2/Model/Request.php

   /**
     * Retrieve accept types understandable by requester in a form of array sorted by quality descending
     *
     * @return array
     */
    public function getAcceptTypes()
    {
        $qualityToTypes = array();
        $orderedTypes   = array();

        foreach (preg_split('/,\s*/', $this->getHeader('Accept')) as $definition) {
            $typeWithQ = explode(';', $definition);
            $mimeType  = trim(array_shift($typeWithQ));

            // check MIME type validity
            if (!preg_match('~^([0-9a-z*+\-]+)(?:/([0-9a-z*+\-\.]+))?$~i', $mimeType)) {
                continue;
            }
            $quality = '1.0'; // default value for quality

            if ($typeWithQ) {
                $qAndValue = explode('=', $typeWithQ[0]);

                if (2 == count($qAndValue)) {
                    $quality = $qAndValue[1];
                }
            }
            $qualityToTypes[$quality][$mimeType] = true;
        }
        krsort($qualityToTypes);

        foreach ($qualityToTypes as $typeList) {
            $orderedTypes += $typeList;
        }
        return array_keys($orderedTypes);
    }

para esto primero creamos un modudo con la siguiente configuración en esta estamos definiendo cual sera clase que remplazara la del core todo esto con el fin de cambiar su comportaminto de acuerdo a nuestra necesidades.

 <?xml version="1.0"?>
<config>
  <modules>
    <IngenieroWeb_Rest>
      <version>0.1.0</version>
    </IngenieroWeb_Rest>
  </modules>
  <global>
    <helpers>
      <rest>
        <class>IngenieroWeb_Rest_Helper</class>
      </rest>
    </helpers>
    <models>
      <rest>
        <class>IngenieroWeb_Rest_Model</class>
        <resourceModel>rest_mysql4</resourceModel>
      </rest>
            <api2>
                <rewrite>
                    <request>IngenieroWeb_Rest_Model_Api2_Request</request>
                </rewrite>
            </api2>
    </models>
  </global>
</config>

Como podremos notar en el código anterior hay una etiqueta con el nombre rewrite es donde le indicaremos la clase que re escribira la del core, ingresamos a nuestra clase y agregamos el siguiente metodo.

 public function getAcceptTypes(){
        $orderedTypes=array("application/json" => 1);
        return array_keys($orderedTypes);
    }

De esta forma es como debemos personalizar el comportamiento de magento, por ultimo les dejo la clase completa para solucionar este punto.

<?php
class IngenieroWeb_Rest_Model_Api2_Request extends Mage_Api2_Model_Request{
      public function getAcceptTypes(){
        $orderedTypes=array("application/json" => 1);
        return array_keys($orderedTypes);
    }
    
}

 

 

Añadir nuevo comentario

Resumen Firma

Carlos Hernan Aguilar Hurtado

Desarrollador WEB

Hola,Soy ingeniero informático radicado en la ciudad de Santiago de Cali orientado al trabajo con soluciones WEB, apasionado por la tecnología siempre en la búsqueda de herramientas y alternativas para mejorar el resultado de los objetivos que se presentan con el día a día.

Carlos Hernan Aguilar Hurtado