2

我正在尝试从 Magento Store 上的 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 双重知识的人能帮助我解决这个问题,我会很高兴。

4

2 回答 2

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); 

从代码片段中看不出什么是客户端的类型,所以我无法猜测您正在使用什么库,但是该库尝试在哪些工具类上寻找一些实用程序类行 PropertyInfo

于 2012-09-18T07:42:06.753 回答
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();
}  
于 2012-09-18T09:55:33.473 回答