0

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

我在 android 中得到了类似的响应

[Products{ID=29; Name=product1; Url=product1.jpg; }, Products{ID=30; Name=product2; Url=product2.jpg; }]

这个响应是一个元素,response.getProperty(0) 如果我将此代码粘贴到http://jsonviewer.stack.hu/站点,那么它会告诉我它不是有效的 json,我是 nusoap 的新手,所以我不知道这如何给出 json /XML 响应 代码有问题吗?我也尝试过 Android 代码:

 SoapObject response = (SoapObject) envelope.bodyIn;
 SoapObject nameResult = (SoapObject) response.getProperty(0);

在上面,nameResult我在一个属性中获得了所有响应。

4

2 回答 2

1

我以前从未使用过 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(但它是从我的服务器上的类似脚本复制并为您的目的重写),所以它显然未经测试,您也应该涵盖数据库为空的情况

于 2013-03-25T07:34:18.077 回答
0

我已经自己解决了,如果有人需要如何解决这个问题,这里可以提供帮助。

我得到的响应是使用 Vector 解析的,之后我只是简单地创建一个循环来获取每个属性并添加到ArrayList<HashMap<String, String>>.

我的过程就像,从 web 服务获取响应并使用向量解析该响应,我只需检索属性并添加到ArrayList<HashMap<String, String>>.

所以如果这里有人想解析 complexType Array Response 并发现像我这样的问题,他们可以找到如下代码的解决方案

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;
于 2013-03-26T05:29:04.783 回答