2012-09-18 87 views
2

我想从Magento商店的Android客户端调用Web服务。
我现在有很好的成功,但没有问题。转换错误

我想这个数组被转换成适当的java对象。

$arrProducts = array(
array(
    "product_id" => "1", 
    "qty" => 2 
), 
array(
    "sku" => "testSKU", 
    "quantity" => 4 
) 
); 
$resultCartProductAdd = $proxy->call($sessionId, "cart_product.add", 
             array($shoppingCartId, $arrProducts)); 

上面的PHP代码已采取从here

我都试过了。

Object []addtocart=null; 
Log.i("Product Id ", Utils.product_list.get(rowid).getp_Id()); 
Object[] productdetails1=new Object[]{Utils.product_list.get(rowid).getp_Id(),2}; 
//Object[] productdetails2=new Object[]{productdetails1}; 
Object param1[]=new Object[]{Utils.shoppingCartId,productdetails1}; 
Object param[]=new Object[]{Utils.sessionId,"cart_product.add",param1}; 
try { 
    addtocart=(Object[])client.callEx("call", param); 
} catch (XMLRPCException e) { 
    e.printStackTrace(); 
} 

但结果纳入错误,如:

org.cws.magentoAnd.xmlrpc.XMLRPCFault: XMLRPC Fault: One item of products do not have identifier or sku [code 1022] 
at org.cws.magentoAnd.xmlrpc.XMLRPCClient.callEx(XMLRPCClient.java:228) 
at org.cws.magentoAnd.ProductModule.productdetails$CartFunctions.doInBackground(productdetails.java:245) 
at org.cws.magentoAnd.ProductModule.productdetails$CartFunctions.doInBackground(productdetails.java:1) 
at android.os.AsyncTask$2.call(AsyncTask.java:185) 
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306) 
at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) 
at java.lang.Thread.run(Thread.java:1019) 

如果有PHP的双重知识有人和Java会帮我解决这个问题,我会很高兴。

+0

你可以分享你的wsdl,它会有帮助。 –

+0

@sharadendusinha:查看此。 http://www.magentocommerce.com/wiki/doc/webservices-api/api/cart#cart_product.add 其实我没有生成wsdl,我使用的是Magento的内置方法。 –

回答

0

好吧,从@ sharadendu sinha's得到一些想法答案,我已经做了一个Associative Array类似的东西在Java中,将得到所需的结果。

代码如下。

Map map = new HashMap(); 
map.put("product_id", 1); 
map.put("quantity", 1); 
Object[] productdetails1=new Object [] {map}; 
Object param1[]=new Object[]{Utils.shoppingCartId,productdetails1}; 
Object param[]=new Object[]{Utils.sessionId,"cart_product.add",param1}; 
try { 
    Object addtocart=client.callEx("call", param); 
    Log.i("Out Put of Adding", addtocart.toString()); 
} catch (XMLRPCException e) { 
    e.printStackTrace(); 
} 
1

如果您检查堆栈跟踪,你会看到 > 一个项目的产品没有标识或SKU

所以对于SKU的映射是没有得到发现。对于未找到映射的原因也很明显。由于php对象是一个关联数组。 Java的对应部分是Map。

现在,如果我使用像ksoap这样的库进行RPC(基于WebService)调用,我会使用类似PropertyInfo的东西(http://ksoap2.sourceforge.net/doc/api/org/ksoap2/serialization/PropertyInfo.html )做属性名称和它的值之间的映射。所以它取决于你正在使用的客户端库。

在你的代码使用

addtocart=(Object[])client.callEx("call", param); 

它不是从代码snippent,什么是客户端的类型eveident,所以我不能猜测,什么是你的库使用,但有什么图书馆尝试,并寻找一些实用程序类线上PropertyInfo

+0

嘿,我在使用XMLRPC库。请你帮我整理一下XMLRPC库的映射吗? –

+0

有什么办法可以将属性和它的值关联起来吗? –

+0

你能否给出你正在使用的* .jar文件的名称,现在有多少库现在可用。 –