Php 使用KSOAP2库解析WSDL/Soap web服务响应复杂数组
我已经使用nusoap创建了PHP web服务Php 使用KSOAP2库解析WSDL/Soap web服务响应复杂数组,php,android,xml,json,nusoap,Php,Android,Xml,Json,Nusoap,我已经使用nusoap创建了PHP web服务 $namespace="http:/mynamespace.com/mynamespace" $server = new soap_server(); $server->debug_flag = false; $server->configureWSDL("test", $namespace); $server->wsdl->schemaTargetNamespace = $namespace; $server->
$namespace="http:/mynamespace.com/mynamespace"
$server = new soap_server();
$server->debug_flag = false;
$server->configureWSDL("test", $namespace);
$server->wsdl->schemaTargetNamespace = $namespace;
$server->wsdl->addComplexType(
'Products',
'complexType',
'struct',
'all',
'',
array('ID' => array('name' => 'ID','type' => 'xsd:int'),
'ProductName' => array('name' => 'ProductName','type' => 'xsd:string'),
'ImageUrl' => array('name' => 'ImageUrl','type' => 'xsd:string')
)
);
$server->wsdl->addComplexType(
'ProductsArray',
'complexType',
'array',
'',
'SOAP-ENC:Array',
array(),
array(
array('ref'=>'SOAP-ENC:arrayType','wsdl:arrayType'=>'tns:Products[]')
),
'tns:Products'
);
$server->register('GetProductDetails', // method name
array('AgentId' => 'xsd:string'), // input parameters
array('return' => 'tns:ProductsArray'), // output parameters
$namespace, // namespace
$namespace . '#GetProductDetails', // soapaction
'rpc', // style
'sequence', // use
'Get Product Details' // documentation
);
function GetProductDetails($AgentId)
{
$productArray = array();
$sqlQry="SELECT pr.products_id, pr.products_image, pd.products_name FROM `products` pr left join products_description pd on pr.products_id=pd.products_id";
$result=mysql_query($sqlQry);
while($row=mysql_fetch_array($result)){
$product=array();
$product["ID"]=$row['products_id'];
$product["ProductName"]=$row['products_name'];
$product["ImageUrl"]=$row['products_image'];
$productArray[]=$product;
}
return $productArray;
}
$HTTP_RAW_POST_DATA = isset($GLOBALS['HTTP_RAW_POST_DATA'])?$GLOBALS['HTTP_RAW_POST_DATA'] : '';
$server->service($HTTP_RAW_POST_DATA);
我在安卓系统中得到了类似的回应
[Products{ID=29; Name=product1; Url=product1.jpg; }, Products{ID=30; Name=product2; Url=product2.jpg; }]
此响应位于response.getProperty(0)
若我在站点中粘贴了这段代码,它会告诉我这不是有效的json,我是nusoap的新手,所以我不知道这是如何给出json/XML响应的
代码有问题吗?
我也试过了
Android代码:
SoapObject response = (SoapObject) envelope.bodyIn;
SoapObject nameResult = (SoapObject) response.getProperty(0);
在上面的
namesult
中,我在一个属性中得到了所有响应。我以前从未使用过nusoap,但我可以告诉您,正确连接到数据库,并且根据我发现的情况,nusoap可以运行标准的php脚本,在这种情况下,将函数GetProductDetails替换为下面的函数(我使用的是json_encode),您的问题在于如何在while循环中加载单个结果,因此必须改用array_push()
function GetProductDetails($AgentId)
{
// array for JSON response
$productArray = array();
$sqlQry="SELECT pr.products_id, pr.products_image, pd.products_name FROM `products` pr left join products_description pd on pr.products_id=pd.products_id";
$result=mysql_query($sqlQry);
while ($row = mysql_fetch_array($result)) {
// temp user array
$product=array();
$product["ID"]=$row['products_id'];
$product["ProductName"]=$row['products_name'];
$product["ImageUrl"]=$row['products_image'];
// push single product into final response array
array_push($poductArray["products"], $product);
}
// echoing JSON response
echo json_encode($productArray);
}
希望这能起作用这显然是未经测试的,因为我没有你的sql(但它是从我的服务器上类似的脚本复制而来,并为你的目的重写的),你也应该涵盖你的数据库为空的情况我自己已经解决了它,如果有人需要如何解决这个问题,这在这里是有帮助的 我得到的响应是使用Vector解析的,之后我只需做一个循环,获取每个属性并添加到
ArrayList
我的过程类似于,从webservice获取响应并使用vector解析该响应,我只需检索属性并添加到ArrayList
所以,若这里有人想要解析complexType数组响应并发现像我这样的问题,他们可以找到如下代码所示的解决方案
public static final ArrayList<HashMap<String, String>> productMapArray = new ArrayList<HashMap<String, String>>();
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
SoapEnvelope.VER11);
envelope.dotNet = true;
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
request.addProperty("user_id", "1");
try {
androidHttpTransport.call(SOAP_ACTION, envelope);
Vector<SoapObject> response = (Vector<SoapObject>)envelope.getResponse();
for (SoapObject soapObject : response) {
HashMap<String, String> map = new HashMap<String, String>();
map.put(KEY_ID, soapObject.getProperty(KEY_ID).toString());
map.put(KEY_PRODUCT, soapObject.getProperty(KEY_PRODUCT).toString());
map.put(KEY_IMG, soapObject.getProperty(KEY_IMG).toString());
productMapArray.add(map);
}
if (response.toString().equalsIgnoreCase("invalid")) {
result = false;
} else {
result = true;
}
} catch (SocketException ex) {
result = false;
Log.e("Error : ", "Error on soapPrimitiveData() " + ex.getMessage());
ex.printStackTrace();
} catch (Exception e) {
result = false;
Log.e("Error : ", "Error on soapPrimitiveData() " + e.getMessage());
e.printStackTrace();
}
return result;
公共静态最终ArrayList productMapArray=new ArrayList();
SoapObject请求=新的SoapObject(名称空间、方法名称);
SoapSerializationEnvelope=新的SoapSerializationEnvelope(
第11版);
envelope.dotNet=true;
HttpTransportSE androidHttpTransport=新的HttpTransportSE(URL);
请求.添加属性(“用户id”,“1”);
试一试{
调用(SOAP_操作,信封);
向量响应=(向量)envelope.getResponse();
for(SoapObject SoapObject:response){
HashMap=newHashMap();
map.put(KEY_ID,soapObject.getProperty(KEY_ID.toString());
map.put(KEY_-PRODUCT,soapObject.getProperty(KEY_-PRODUCT.toString());
map.put(KEY\u IMG,soapObject.getProperty(KEY\u IMG.toString());
productMapArray.add(map);
}
if(response.toString().equalsIgnoreCase(“无效”)){
结果=假;
}否则{
结果=真;
}
}捕获(SocketException例外){
结果=假;
Log.e(“错误:”,“soapPrimitiveData()上的错误”+ex.getMessage());
例如printStackTrace();
}捕获(例外e){
结果=假;
Log.e(“错误:”,“soapPrimitiveData()上的错误”+e.getMessage());
e、 printStackTrace();
}
返回结果;
echo不起作用,因为它有自己的响应代码,如上面的'array('return'=>'tns:ProductsArray'),//output parameters',我也尝试过用代码返回代替echo,但它给出了空白数组,因为它与返回代码不匹配。好的,我现在看到了。我还注意到函数GetProductDetails($AgentId)正在返回productArray,在$server->register(…可能有输出响应的内容,比如输出json或xml。echo在这里不起作用。它给出了“500服务器错误”。你能告诉我如何解析上面的响应“[Products]吗android中的{ID=29;Name=product1;Url=product1.jpg;},Products{ID=30;Name=product2;Url=product2.jpg;}]?简而言之,实际代码不是,不幸的是,要弄清楚这一点需要相当多的工作(android内置了解析json的函数)尽管有可能,我还是会重新考虑如何正确编码json,如果您想了解如何进行编码,请尝试sourceforge上的nusoup论坛。请参考(将此粘贴到eclipse中,因为我刚刚将json解析器复制到html文档中)最后一个try-catch块,你给了我解析在线json的链接,但这是soap的响应,所以我不能像你建议的那样直接提出任何请求。我在android中得到了一个解析此类数组的链接,php教程中的相同响应是。我尝试过,但仍然缺少一些东西。。