NuSOAP -函数参数不能正确映射


NuSOAP - Function parameters don't map correctly

我在PHP中使用NuSOAP编写web服务。为了测试它,我编写了一个服务器和一个客户机。在服务器端,我像这样注册函数:

$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

效果很好,但是如果我把param1和param2切换到

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

则param1获取value2, param2获取value1。显然,它只是根据参数的顺序,而不是名称。

我想,既然我用特定的参数名注册了函数,然后调用了函数,指定了这些参数名,那么它们就会被相应地赋值。

我错过了什么吗?如果参数名只是被抛出并按输入顺序赋值,那么指定参数名的意义何在?是否有一种方法可以使我能够以任何顺序输入参数并使它们正确映射?

可以在客户端使用默认映射:

    $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。你呢?(我使用nussoap已经很长时间了,但我记得我只是添加了"?"到服务器url的"Wsdl"参数足以让服务器响应一个有效的Wsdl)