0

几个月前我问过这样的问题,但问题是 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 $

我一直在网上寻找如何做到这一点,但我完全一无所知,所以非常感谢任何帮助。提前致谢。

4

2 回答 2

2

通过将命名空间声明为参数来设置命名空间。默认情况下,命名空间设置为“ http://tempuri.org ”(一些肥皂服务器需要额外的正斜杠,如“ http://tempuri.org/ ”)。所以当你使用 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>";
}
于 2015-01-05T21:22:17.437 回答
1

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

于 2012-09-10T16:48:48.123 回答