Android-Magento- Как получить информацию о нескольких продуктах в Android с помощью XML-RPC

Как получить информацию о нескольких продуктах в режиме Single Call в Android с помощью XMLRPC от Magento. Я могу получить список продуктов, используя функцию catalog_product.list используя XMLRPC.

Теперь у меня есть идентификаторы SKU для всех продуктов. Я могу получить информацию о мультимедиа каждого продукта, используя функцию product_media.list .

Если у меня есть 10 продуктов, я должен вызвать 10-кратный метод product_media.list для каждого продукта, который занимает много времени.

Итак, как я могу назвать функцию multiCall Magento в Android. Многие учебники по php для вызова функции multiCall публикуются, но я не могу имитировать то же самое в Android.

Поэтому, пожалуйста, помогите мне, если у вас есть аналогичный фрагмент кода, который может заставить меня понять функцию multiCall ( для Android ), чтобы я мог продвигать ее дальнейшее использование.
Благодарю.


PHP-код Пример из Josua Marcel Chrisano :


 $session = $client->call('login', array('apiUser', 'apiKey')); $client->call('call', array($session,'somestuff.method', array('arg1', 'arg2', 'arg3'))); $client->call('call', array($session, 'somestuff.method', 'arg1')); $client->call('call', array($session, 'somestuff.method')); $client->call('multiCall', array($session, array( array('somestuff.method', 'arg1'), array('somestuff.method', array('arg1', 'arg2')), array('somestuff.method') ) ) ); 

Я хотел бы подражать вышеуказанному PHP-коду в Android, который вызывает multiCall() Magento.


    После долгого исследования я получил решение на multiCall() которое вызывает метод multiCall() без каких-либо Error , но все же я не знаю, как получить ответ Server в переменной и использовать его.

    Любой, кто знает об этом, может отредактировать мой ответ , я буду ему благодарен.

    Code который я использовал:

     Object[] skuid=new Object[product_list.size()]; Object calling[]=new Object[product_list.size()]; for(int m=0;m<product_list.size();m++) { skuid[m]=new Object[]{product_list.get(m).getp_Sku()}; calling[m]=new Object[]{"catalog_product_attribute_media.list",skuid[m]}; } try { client.callEx("multiCall",new Object[]{Utils.sessionId,calling}); } catch (XMLRPCException e) { e.printStackTrace(); } 

    Подтверждения:

    Я работал над ответом, опубликованным Iain .

    Первый логин любым способом работает для вызова catalog_product.list. Убедитесь, что параметры session , client и product_ids имеют правильные значения. Если вам не нужно входить в систему для этих операций, установите session = null (и если это не сработает, попробуйте не проходить сеанс вообще :)). Затем:

     Object[][] calls = new Object[product_ids.length]; for (int i = 0; i < product_ids.length; i++) { calls[i] = new Object[] { "product_media.list", product_ids[i] }; } product_media_ids = client.call("multiCall", new Object[] { session, calls }); 

    Затем product_media_ids должен быть массивом массивов изображений продуктов, т. product_media_ids Каждый элемент product_media_ids будет возвратным значением из product_media.list .

    Боюсь, код не проверен.

    Ответ

    Так как приложение для Android основано на Java, вы можете использовать его.

     package org.apache.xmlrpc; import java.util.Hashtable; import java.util.Vector; public class MultiCall implements ContextXmlRpcHandler { public Object execute(String method, Vector params, XmlRpcContext context) throws Exception { if ("multicall".equals(method)) { return multicall(params, context); } throw new NoSuchMethodException("No method '" + method + "' in " + this.getClass().getName()); } public Vector multicall(Vector requests, XmlRpcContext context) { // The array of calls is passed as a single parameter of type array. requests=(Vector)requests.elementAt(0); Vector response = new Vector(); XmlRpcServerRequest request; for (int i = 0; i < requests.size(); i++) { try { Hashtable call = (Hashtable) requests.elementAt(i); request = new XmlRpcRequest((String) call.get("methodName"), (Vector) call.get("params")); Object handler = context.getHandlerMapping().getHandler(request.getMethodName()); Vector v = new Vector(); v.addElement(XmlRpcWorker.invokeHandler(handler, request, context)); response.addElement(v); } catch (Exception x) { String message = x.toString(); int code = (x instanceof XmlRpcException ? ((XmlRpcException) x).code : 0); Hashtable h = new Hashtable(); h.put("faultString", message); h.put("faultCode", new Integer(code)); response.addElement(h); } } return response; } } 

    Источник


    Поскольку Magento поддерживает SOAP API, почему вы не использовали SOAP API v1? Потому что SOAP является мощным. Попробуйте здесь. В чем разница между XML-RPC и SOAP?

    Разбор сообщений с мылом не включен в среду выполнения Android, поэтому это не так просто. Вы должны использовать внешнюю библиотеку. Я использую ksoap2.

    Если вы ищете здесь в StackOverflow, вы увидите много примеров того, как его использовать. Например, здесь

    Другие ссылки: ссылка 1 ссылка 2

    MultiCall с PHP

     $client = new Zend_XmlRpc_Client('http://magentohost/api/xmlrpc/'); // If somestuff requires api authentification, // we should get session token $session = $client->call('login', array('apiUser', 'apiKey')); $client->call('call', array($session, 'somestuff.method', array('arg1', 'arg2', 'arg3'))); $client->call('call', array($session, 'somestuff.method', 'arg1')); $client->call('call', array($session, 'somestuff.method')); $client->call('multiCall', array($session, array( array('somestuff.method', 'arg1'), array('somestuff.method', array('arg1', 'arg2')), array('somestuff.method') ) )); // If you don't need the session anymore $client->call('endSession', array($session));