PHP SoapClient主体必须存在于SOAP信封中.错误


PHP SoapClient "Body must be present in a SOAP envelope" error

我在尝试使用PHP SoapClient服务http://bws.neteven.com/NWS/2时遇到了一个非常奇怪的问题。

我必须设置一个身份验证头。请求体应该为空。我使用的代码如下:

    $client = new SoapClient("http://bws.neteven.com/NWS/2", array("trace" => 1, "exception" => 1));
    $auth = array(//the params are not valid of course
        'Method' => 'TestConnection',
        'Login' => 'login',
        'Seed' => 'seed',
        'Stamp' => 'stamp',
        'Signature' => 'signature'
    );
    $client->__setSoapHeaders(new SoapHeader('auth', 'AuthenticationHeader', $auth));
    $client->__soapCall('TestConnection',array(null));

之后,我使用$client->__getLastRequest()来查看请求的最终XML。然而,我可以看到头部和主体参数没有正确设置。$client->__getLastRequest()输出纯文本,如下所示:

MethodTestConnectionLoginloginSeedseedStampstampSignaturesignature

看起来不像有效的XML。当然,我得到SoapFault异常的文本"Body必须存在于SOAP信封中"。

有谁知道为什么头和体不是由所需的XML标签包装?

代码有问题吗?因为我看到了许多使用相同方法的PHP SoapClient示例。此外,我还尝试了一些测试WSDL服务,并在那里获得了有效的请求和响应。

可能是提供的WSDL模式的问题吗?

还是我的服务器配置有问题?我使用PHP 5.6.3, php_soap扩展是启用的。

希望你们能帮助我。如有任何意见,我将不胜感激。

谢谢。

我发现的代码示例有一个不同的URL…

http://bws.neteven.com/NWS/2 vs http://ws.neteven.com/NWS

$client = new SoapClient("http://ws.neteven.com/NWS", array("trace" => 1, "exception" => 1));
$auth = array(//the params are not valid of course
    'Method' => 'TestConnection',
    'Login' => 'login',
    'Seed' => 'seed',
    'Stamp' => 'stamp',
    'Signature' => 'signature'
);
$client->__setSoapHeaders(new SoapHeader('auth', 'AuthenticationHeader', $auth));
$client->__soapCall('TestConnection',array(null));

同样,你可以调用这样的方法,而不使用__soapCall(即使它会做同样的事情)。

$result = $client->echo(array("EchoInput" => "ReturnMe"));
var_dump($result->EchoOutput);
$result = $client->TestConnection();
var_dump($result->TestConnectionResult);