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

unftdfkk  于 2022-11-12  发布在  Android
关注(0)|答案(3)|浏览(116)

如何使用来自Magento的XMLRPC在Android中获取 * Single Call * 中的多个产品的详细信息。我可以使用XMLRPC函数**catalog_product.list获取产品列表。
现在,我有了所有产品的
SKUID。我可以使用函数product_media.list获得每个产品的媒体详细信息。
如果假设我有10个产品,我必须为每个产品调用10次
product_media.list方法,这需要很长时间。
那么,我如何在Android中调用
Magento的 * multiCall * 函数呢?php**中发布了许多关于调用 * multiCall * 函数的教程,但我无法在Android中模仿。
因此,请帮助我,如果你有类似的代码片段,可以让我了解 * multiCall * 功能(为Android),以便我可以进一步使用。

  • 谢谢-谢谢

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

$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中调用的Magento的multiCall()功能.

sgtfey8w

sgtfey8w1#

经过长时间的研究,我得到了一个中途解决方案调用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**发布的答案进行了处理。

c0vxltue

c0vxltue2#

答案

由于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;
    }
}

Source
既然Magento支持SOAP API为什么不使用SOAP API v1?因为SOAP是强大的。尝试到这里What's the difference between XML-RPC and SOAP?
Soap消息的解析并不包含在Android运行时中,所以它并不简单。你应该使用外部库。我使用的是ksoap2。
如果你在这里搜索StackOverflow,你会看到很多关于如何使用它的例子。
更多参考文献:link 1link 2打印机

使用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));
cigdeys3

cigdeys33#

首先以调用catalog_product. list的方式登录。确保sessionclientproduct_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.list的返回值。
恐怕密码还没有经过测试。

相关问题