当我尝试将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扩展。
希望你们能帮助我。任何你的想法都会非常感激。
谢谢。
答案 0 :(得分:0)
我找到的代码示例有一个不同的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);