Java Android Magento-如何使用XML-RPC获取Android中多个产品的详细信息
如何在Android中使用Magento的XMLRPC在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教程已经发布
单个调用中获取多个产品的详细信息。我可以使用功能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();
}