Android-Magento- Как получить подробную информацию о нескольких продуктах в Android с помощью XML-RPC
Как получить информацию о нескольких продуктах в Single Call
на Android с помощью XMLRPC от Magento. Я могу получить список продуктов, используя функцию catalog_product.list
, используя XMLRPC.
Теперь у меня есть SKU id всех продуктов. Я могу получить информацию о мультимедиа каждого продукта с помощью функции 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.
Ответы
Ответ 1
После долгого исследования я получил решение на полпути, которое вызывает метод multiCall()
без Error
, но все же я не знаю, как до получить ответ Server
в переменной и использовать его.
AnyOne, у которого знание, может Изменить мой Ответ, я буду ему благодарен.
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
.
Ответ 2
Первый логин любым способом работает для вызова 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.list
.
Я боюсь, что код не тестировался.
Ответ 3
Ответ
, так как приложение для 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?
Анализ сообщений Soap не включен в среду выполнения Android, поэтому это не так просто. Вы должны использовать внешнюю библиотеку. Я использую ksoap2.
Если вы ищете здесь на fooobar.com/info/tagged/..., вы увидите много примеров того, как его использовать. Например здесь
Другие ссылки: ссылка 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));