如何使用NuSOAP设置命名空间(客户端)

时间:2012-09-10 15:53:49

标签: php web-services nusoap webservices-client

几个月前我问过这样的问题,但问题是WebService无法正常工作。现在它工作得很好,我仍然在提出简单的请求时遇到问题。 首先,我用http://www.validwsdl.com/尝试了它 WS是http://amibcertifica.amib.com.mx:9090/axis2/services/JpaWebServicesAmib?wsdl 你可以自己尝试一下。它适用于该网站。 现在我正在尝试使用NuSOAP发出请求,我收到此错误:namespace mismatch require http://ws.mobius.amib found http://tempuri.org

您可以在此处查看整个错误:http://dev.etic.com.mx/bmv/test.php

我的代码如下:

<?php 
require_once('nusoap/lib/nusoap.php');

$url = "http://amibcertifica.amib.com.mx:9090/axis2/services/JpaWebServicesAmib?wsdl";


try
{
    $client = new nusoap_client($url);
    $err = $client->getError();
if ($err) {
    // Display the error
    echo '<h2>Constructor error</h2><pre>' . $err . '</pre>';
    // At this point, you know the call that follows will fail
}
    $result = $client->call('findAllComprobanteOperacion');
}
catch (SoapFault $e)
{
    echo 'Error0'.$e->getMessage() . "\n";
}

echo '<pre>';print_r( $result );
echo $client->debug_str;
?>

NuSOAP版本:$Id: nusoap.php,v 1.123 2010/04/26 20:15:08 snichol Exp $

我一直在网上寻找如何做到这一点,我完全无能为力,所以任何帮助都非常感激。 提前谢谢。

2 个答案:

答案 0 :(得分:1)

这比我想象的要简单。我只需要将nusoap_client的第二个参数设置为TRUE(因为它默认为FALSE)。所以,它是$client = new nusoap_client($url, TRUE); 而已。 不管怎样,谢谢。

答案 1 :(得分:1)

通过将其声明为参数来设置命名空间。默认情况下,命名空间设置为&#34; http://tempuri.org&#34; (某些soap服务器需要额外的正斜杠,例如&#39; http://tempuri.org/&#39;)。因此,当您使用call函数时,可以在第三个参数中设置名称空间,如下所示:

$result = $client->call('findAllComprobanteOperacion', null, 'http://tempuri.org/');

您也可以声明您的参数并设置SoapAction,第四个参数,如下所示:

$result = $client->call('findAllComprobanteOperacion', array('Argument1' => 'value1', 'Argument2' => 'value2'), 'http://tempuri.org/', 'SoapActionHere');

默认情况下,NuSoap还会强制使用1000到9999之间的随机数作为命名空间的前缀(变量名)。这也可能是服务器不喜欢的。没有内置的方法来实际纠正这个问题。我只是编辑了nusoap.php来解决这个问题。在第7431行(或附近),您将找到:

$this->debug("wrapping RPC request with encoded method element");
if ($namespace) {
// http://www.ws-i.org/Profiles/BasicProfile-1.1-2004-08-24.html R2735 says rpc/literal accessor elements should not be in a namespace
    $payload = "<$nsPrefix:$operation xmlns:$nsPrefix=\"$namespace\">" .
            $payload . "</$nsPrefix:$operation>";
} else {
    $payload = "<$operation>" . $payload . "</$operation>";
}

将其更改为:

if ($namespace) {
    $payload = "<$operation xmlns=\"$namespace\">" .
        $payload . "</$operation>";
} else {
    $payload = "<$operation>" .
            $payload . "</$operation>";
}