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):
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”
Comments are closed.
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='…')
loadJson(‘< ?xml version
is telling me that you actually make an XML request from your app, not a JSON request.Thank you for reply,
How can I make json request, if you can give some sample would be great help.
Here is an example (solution 2): http://magento.stackexchange.com/questions/510/how-to-access-the-magento-api-from-native-client-with-javascript
It is in JavaScript and uses Titanium for an AJAX request, but you should see what the parameters are. For examples on Android, see any generic JSON-RPC example and adjust the parameters: http://lmgtfy.com/?q=android%20json%20rpc%20client%20example
Thank you very much for your valuable time and a great module. This is really very helpful. 🙂
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