Ein JSON-RPC Adapter für die Magento API

Beim Durchsehen meiner alten Antworten auf Magento StackExchange bin ich auf diese Frage zum Ansprechen der Magento API via JavaScript gestoßen und musste feststellen dass der Link auf GitHub, der einen wesentlichen Teil der Lösung enthielt, nämlich die Implementierung eines JSON-RPC Adapters für die Magento-API mittlerweile tot ist.

Also habe ich kurzerhand das komplette daraus entstandene Modul selbst veröffentlicht (der originale Link war ein Core Hack):

GitHub: SGH_JsonRpc

Das ganze Modul sind weniger als 100 Zeilen Code. In config.xml wird unser Controller der api Route hinzugefügt:

    <frontend>
        <routers>
            <api>
                <args>
                    <modules>
                        <sgh_jsonrpc before="Mage_Api">SGH_JsonRpc_Api</sgh_jsonrpc>
                    </modules>
                </args>
            </api>
        </routers>
    </frontend>

Der neue API Adapter wird in api.xml definiert:

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <api>
        <adapters>
            <jsonrpc>
                <model>sgh_jsonrpc/api_server_adapter_jsonrpc</model>
                <handler>default</handler>
                <active>1</active>
            </jsonrpc>
        </adapters>
    </api>
</config>

Der Controller ist sehr schlank und funktioniert analog zu Mage_Api_XmlrpcController. Zusätzlich ist die Methode methodsAction implementiert, so dass der Aufruf von /api/jsonrpc/methods eine Service-Definition zurückgibt.

class SGH_JsonRpc_Api_JsonrpcController extends Mage_Api_Controller_Action
{
    public function indexAction()
    {
        $this->_getServer()->init($this, 'jsonrpc')->run();
    }
    public function methodsAction()
    {
        $this->_getServer()->init($this, 'jsonrpc')->getAdapter()->serviceMap();
    }
}

Und dies ist schließlich der API-Adapter. Im wesentlichen ist es eine Kopie von Mage_Api_Model_Server_Adapter_Xmlrpc wobei die Zend_XmlRpc Klassen durch ihr Zend_Json Äquivalent ersetzt wurden:

class SGH_JsonRpc_Model_Api_Server_Adapter_Jsonrpc extends Varien_Object
        implements Mage_Api_Model_Server_Adapter_Interface {

    protected $_jsonRpc = null;

    public function setHandler($handler) {
        $this->setData('handler', $handler);
        return $this;
    }

    public function getHandler() {
        return $this->getData('handler');
    }

    public function setController(Mage_Api_Controller_Action $controller) {
        $this->setData('controller', $controller);
        return $this;
    }

    public function getController() {
        $controller = $this->getData('controller');

        if (null === $controller) {
            $controller = new Varien_Object(
                array(
                    'request'  => Mage::app()->getRequest(),
                    'response' => Mage::app()->getResponse()
                )
            );
            $this->setData('controller', $controller);
        }
        return $controller;
    }

    public function run() {
        $this->_jsonRpc = new Zend_Json_Server();
        $this->_jsonRpc->setClass($this->getHandler());
        $this->getController()->getResponse()->clearHeaders()
             ->setHeader('Content-Type', 'application/json; charset=utf-8')
             ->setBody($this->_jsonRpc->handle());
        return $this;
    }

    public function serviceMap() {
        $this->_jsonRpc = new Zend_Json_Server();
        $this->_jsonRpc->setClass($this->getHandler());
        $this->getController()->getResponse()->clearHeaders()
             ->setHeader('Content-type', 'application/json; charset=utf-8')
             ->setBody($this->_jsonRpc->getServiceMap());
        return $this;
    }

    public function fault($code, $message) {
        throw new Zend_Json_Exception($message, $code);
    }
}

Das war es schon! Jetzt kann die API über /api/jsonrpc angesprochen werden (mit den selben Methoden wie die XML-RPC API)

6 Replies to “Ein JSON-RPC Adapter für die Magento API”

  1. I tried it and accessed it from my android application and I get this error. Can you please look into it.
    a:5:{i:0;s:29:”Decoding failed: Syntax error”;i:1;s:1741:”#0 D:\wamp_2.5\www\magento_default\lib\Zend\Json\Server\Request.php(251): Zend_Json::decode(‘loadJson(‘<?xml version='…')

      1. Thank you for reply,
        How can I make json request, if you can give some sample would be great help.

  2. Hi,
    How to make request in php.

    login('Guest', '18181xxxxxxxx76767667xxx');
    $result = $proxy->catalogProductList($sessionId);
    var_dump($result);
    } catch (Exception $e) {
    echo nl2br($e->getMessage()).''."\n";
    }
    ?>

    It is returning session but when I tried to print result. It is displaying “Request error: Array” . Can you please help on this. Thanks

Comments are closed.