Java Android Magento-如何使用XML-RPC获取Android中多个产品的详细信息

Java Android Magento-如何使用XML-RPC获取Android中多个产品的详细信息,java,android,magento,xml-rpc,Java,Android,Magento,Xml Rpc,如何在Android中使用Magento的XMLRPC在单个调用中获取多个产品的详细信息。我可以使用功能catalog\u product.list使用XMLRPC获取产品列表 现在,我有了所有产品的SKUid。我可以使用功能product\u media.list获取每个产品的媒体详细信息 如果假设我有10种产品,我必须调用10次产品\媒体。列出每种产品需要花费很长时间的方法 那么,我如何在Android中调用Magento的多调用功能呢。很多关于调用multiCall函数的php教程已经发布

如何在Android中使用Magento的XMLRPC在
单个调用中获取多个产品的详细信息。我可以使用功能
catalog\u product.list
使用XMLRPC获取产品列表

现在,我有了所有产品的SKUid。我可以使用功能
product\u media.list
获取每个产品的媒体详细信息

如果假设我有10种产品,我必须调用10次
产品\媒体。列出每种产品需要花费很长时间的方法

那么,我如何在Android中调用Magento的
多调用功能呢。很多关于调用
multiCall
函数的
php
教程已经发布,但我无法在Android中模仿

因此,如果您有类似的代码片段,请帮助我理解
multiCall
函数(适用于Android),以便我进一步使用它。
谢谢


来自Josua Marcel Chrisano的答案的PHP代码示例



我想在Android中模拟上面的php代码,它调用Magento的
multiCall()
函数


答案 因为android是基于java应用程序的,所以您可以使用它。


以任何方式首次登录都可以调用catalog_product.list。确保
会话
客户端
产品ID
具有正确的值。如果不需要为这些操作登录,请设置
session=null
(如果不起作用,请尝试根本不传递session:)。然后:

Object[][]调用=新对象[product_id.length];
对于(int i=0;i
product\u media\u id
应该是一个产品图像数组-也就是说,
product\u media\u id
的每个元素都是
product\u media.list的返回值


这段代码恐怕没有经过测试。

经过长时间的研究,我得到了中间解决方案,即调用
multiCall()
方法,没有任何
错误
,但我仍然不知道如何在变量中获取
服务器的响应,并使用它

任何有知识的人都可以编辑我的答案,我将感谢他

我使用的
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();
}  
Object[]skuid=新对象[product_list.size()];
对象调用[]=新对象[product_list.size()];

首先,我感谢您的努力。现在,我想从您的回答中澄清一些事情。首先,您建议的MultiCall方法是为客户端硬编码的,这是完全错误的。我们在Magento中有一个内置的服务器端MultiCall()方法,它将从Android客户端调用,就像简单调用()一样方法。您以完全不同的方式理解了这个概念。其次,Java和Android有不同的XMLRPC库。您在这里建议的库是Java的,Android不支持。还是很好的尝试。谢谢。据说您想要Android的multiCall函数。我已经编辑了我的答案。是的,请参阅..您已经更新了php,其中名为multiCall(参数)的方法调用了服务器上已经存在的。对。类似地,我想从我的Android设备调用该方法。我希望将您现在建议的php代码放在我的问题中,以便大家对我的问题更清楚。感谢您将我的问题提高到另一个高度。您是否有用于调用catalog_product.lis的XML-RPC库t和product_media.list?你能谈谈你已经用multiCall做了哪些尝试吗?@lain是的,我正在使用XML-RPC库调用每个列表和其他数据。我自己尝试了很多生动的方法,但每次都失败了。最糟糕的是,在我10天的研究中,没有一个例子可以提示我使用multiCall()方法。如果我只使用一个call()方法,那么我就能够获取所有内容。但是您可能知道,使用call方法进行5次调用都会花费更多的时间。multiCall()方法的主要优点是它会占用“客户端的所有调用”您使用的是哪一个XML-RPC库?@laim它是针对Android的--@laim::我会为您测试并用结果进行回复。@laim::它给出的错误类似于::08-02 09:03:36.931:WARN/System.err(24961):org.xmlrpc.Android.XMLRPCFault:xmlrpc Fault:调用参数与签名不匹配[代码623]您需要找到一种方法来确定该错误是在multiCall本身中抛出的,还是在
产品\u媒体列表中抛出的。执行此操作的一些方法:使magento真正详细地记录日志,或使
调用
一个长度为0的数组,或将
调用
中的第一个条目替换为对e服务器。这个错误是因为
会话设置正确、设置为null还是遗漏了?不用担心。如果我是你,我会尝试使用0长度的多调用体,并让magento打印大量输出(如果需要,对源代码进行黑客攻击,假设你有一个本地开发实例,你可以这样做)看看它能走多远。祝你好运!
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;
    }
}
$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));
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 });
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();
}