2013-01-01 32 views
1

tl; dr:發送多個字符串作爲對SOAP請求的響應。在PHP中通過SOAP返回多個值

我是新來的SOAP。我寫了一個簡單的Web服務,它通過SOAP爲請求提供服務。因爲我想在PHP中實現這一點,所以我使用了NuSOAP庫。給我的SOAP API設計規範如下。

REQUEST FORMAT:

<?xml version="1.0" encoding="utf-8"?>  
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:q0="http://www.sandeepraju.in/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">  
<soapenv:Body>  
<q0:getData>  
<token>String</token>  
</q0:getData>  
</soapenv:Body>  
</soapenv:Envelope> 

實施例/示例響應:

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> 
<S:Body> 
<ns2:getDataResponse xmlns:ns2="http://www.sandeepraju.in/"> 
<return> 
<Data> 
    <animal>cat</animal> 
    <phone>225</phone> 
    <code>FYI</code> 
</Data> 

我爲上述說明書的書面PHP代碼如下。

require_once("../nusoap_old/lib/nusoap.php"); 

// Definition of getData operation 
function getData($token) { 
    if($token == "somestring") { 
     return array("animal" => "cat", "phone" => "225", "code" => "FYI"); 
    } 
    else { 
     return array("animal" => "null", "phone" => "null", "code" => "null"); 
    } 
} 

// Creating SOAP server Object 
$server = new soap_server(); 

// Setup WSDL 
$server->configureWSDL('catnews', 'urn:catinfo'); 

$server->wsdl->addComplexType('return_array_php', 
    'complexType', 
    'struct', 
    'all', 
    '', 
    array(
    'animal' => array('animal' => 'animal', 'type' => 'xsd:string'), 
    'phone' => array('phone' => 'phone', 'type' => 'xsd:string'), 
    'code' => array('code' => 'code', 'type' => 'xsd:string') 
    ) 
); 

// Register the getData operation 
$server->register("getData", 
    array('token' => 'xsd:string'), 
    array('return' => 'tns:return_array_php'), 
    'urn:catinfo', 
    'urn:catinfo#getData'); 

// Checking POST request headers 
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA)? $HTTP_RAW_POST_DATA : ""; 
$server->service($HTTP_RAW_POST_DATA); 

在這裏,我想我應該返回一個PHP數組。但我不確定我應該按照規範返回什麼。誰能幫我這個。或者返回一個數組是正確的?

+0

我想說這取決於Nusoap如何處理它。我特別不瞭解Nusoap,所以除此之外,我不能有太多的幫助。也許這是他們的文檔中概述的? – hakre

+0

是的你是對的。我沒有發現NuSoup的很多文檔。我想我有一個解決方案。我必須測試它。我說的沒錯,明天我會在這裏更新,以便其他人在面臨同樣的問題時可以使用它。 :) –

+0

如果您找到解決方案(甚至只是中途解決),請將其作爲下面的答案。你甚至可以接受它。這在這個網站上完全有效,非常受歡迎。對不起,我沒有更多的幫助。 – hakre

回答

3

您需要爲包含數據的數組添加另一種複雜類型。 像這樣:

$server->wsdl->addComplexType(
    'dataArray', // MySoapObjectArray 
    'complexType', 'array', '', 'SOAP-ENC:Array', 
    array(), 
    array(array('ref'=>'SOAP-ENC:arrayType','wsdl:arrayType'=>'tns:return_array_php[]')), 'tns:return_array_php' 
); 

註冊新的數據類型爲函數的返回值。

$server->register(
    'getData',  
    array('Datum'=>'xsd:token'), 
    array('return'=>'tns:dataArray'), 
    $namespace, 
    false, 
    'rpc', 
    'encoded', 
    'description' 
); 

然後你的函數需要設置數組的單個部分。

function GetData($token) 
{ 
    if($token == "somestring") { 
     $result[0] = array(
      "animal" => "cat", 
      "phone" => "225", 
      "code" => "FYI" 
     ); 

     $result[1] = array(
      "animal" => "dog", 
      "phone" => "552", 
      "code" => "IFY" 
     ); 
    } else { 
     $result = null; 
    } 
    return $result; 
} 

該服務調用帶有字符串 「somestring」 的響應將是:

<ns1:getDataResponse xmlns:ns1="http://localhost/status/status.php"> 
    <return xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="tns:return_array_php[2]"> 
     <item xsi:type="tns:return_array_php"> 
      <animal xsi:type="xsd:string">cat</animal> 
      <phone xsi:type="xsd:string">225</phone> 
      <code xsi:type="xsd:string">FYI</code> 
     </item> 
     <item xsi:type="tns:return_array_php"> 
      <animal xsi:type="xsd:string">dog</animal> 
      <phone xsi:type="xsd:string">552</phone> 
      <code xsi:type="xsd:string">IFY</code> 
     </item> 
    </return> 
</ns1:getDataResponse> 

符合您的要求。