2011-08-29 62 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