2011-08-29 63 views
1

我正在PHP中使用NuSOAP編寫Web服務。爲了測試它,我寫了一個服務器和一個客戶端。在服務器端,我註冊的功能,像這樣:NuSOAP - 函數參數映射不正確

$server->register(
    "testFunction", 
    array("param1" => "xsd:string", "param2" => "xsd:string"), 
    array("result" => "xsd:string"), 
    "http://localhost/testApp" 
); 

和客戶端上看起來是這樣的:

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

$client = new soapclient("http://localhost/testApp/server.php"); 
$function = $_GET["function"]; 
unset($_GET["function"]); 
$result = $client->call($function, $_GET); 

echo "<pre>". print_r($result, true) ."</pre>"; 

當我這樣稱呼它

http://localhost/testApp/client.php?function=testFunction&param1=value1&param2=value2 

它工作正常,但如果我切換參數1和參數2並說

http://localhost/testApp/client.php?function=testFunction&param2=value2&param1=value1 

然後param1獲取值value2和param2獲取值value1。很顯然,它只是按照參數的順序,而不是名稱。

我想,因爲我註冊了具有特定參數名稱的函數,然後調用該函數,指定這些參數名稱,他們將相應地分配。

我錯過了什麼嗎?指定參數名稱的意義在於,只要按照輸入的順序將其拋出並分配,有沒有一種方法可以讓我可以按任何順序輸入參數並讓它們正確映射?

回答

0

也許去在客戶端的默認地圖:

$default = array(
     'param1' => '', 
     'param2' => 'test', 
    ); 
    $params = $defaults; 
    foreach ($_GET as $param_name => $param_value) { 
     if (isset($params[ $param_name ])) $params[$param_name] = $param_value; 
    } 
    $client->call($function, $params); 

簡單的黑客,即使它不「真」回答您的問題。

需要注意的是,如果您希望客戶端知道所做調用的格式,則您傳遞給客戶端的URL必須是SOAP WSDL。是你的 ? (我已經使用nuSoap很長一段時間了,但我記得簡單地向服務器url添加「?wsdl」參數足以讓服務器以有效的wsdl響應)

+0

不是一個壞主意,但它需要多一點對我來說。可以調用很多函數,不同順序的參數不同,所以我必須做一些switch語句,併爲每個函數設置默認參數。另外,我寫的客戶端僅用於我自己的測試。我不會爲我們的客戶提供任何客戶,因爲我認爲這幾乎違背了使用SOAP的目的。他們需要編寫自己的客戶端來使用Web服務。 – Travesty3