我必须调用一个需要基本身份验证的soap WebService。我试用了带有基本身份验证的SoapUI及其工作原理。可以正确地从浏览器加载WSDL页面。不存在SSL相关问题。
我正在尝试对SoapClient执行相同的调用,但无法正常工作。据我所知(在Burp软件的帮助下(身份验证标头不是用soapClient发送的。
当我遇到这个问题时,我检查了StackOverflow上几乎所有相关的问题,并尝试了他们提出的所有建议。
这是我正在编写的PHP代码:
echo "<pre>";
$WSDL_URL='https://myserver.com/services/?wsdl';
$username='xxx';
$password='yyy';
$params = array(
'login' => $username,
'password' => $password,
'trace' => 0,
'exceptions' => 0,
'location' => $WSDL_URL,
'uri' => $WSDL_URL
);
$soap = new SoapClient(null, $params);
$RESULT = $soap->serviceTest( 'HELLO' );
echo "<h1>ServiceTEST Result:</h1>";
print_r($RESULT);
这是我的错误:
SoapFault Object
(
[message:protected] => Client Error
[string:Exception:private] =>
[code:protected] => 0
[file:protected] => /Applications/MAMP/htdocs/soap/test.php
[line:protected] => 24
[trace:Exception:private] => Array
(
[0] => Array
(
[file] => /Applications/MAMP/htdocs/soap/test.php
[line] => 24
[function] => __call
[class] => SoapClient
[type] => ->
[args] => Array
(
[0] => serviceTest
[1] => Array
(
[0] => HELLO
)
)
)
)
[previous:Exception:private] =>
[faultstring] => Client Error
[faultcode] => s:Client
)
我设法在wsdl请求中不包括登录名/密码的情况下获得了服务列表,所以是的,soapclient正在使用此服务器。
我在使用登录名和密码时出现了500错误,所以这似乎是服务器端的一个问题。
以下代码可以帮助您获得有关soap响应的更多详细信息
<?php
$username='xxx';
$password='yyy';
$WSDL_URL='https://myserver.com/services/?wsdl';
$params = array(
// witout params it works at least for the wsdl
//'login' => $username,
//'password' => $password
);
try {
$soap = new SoapClient( $WSDL_URL, $params);
$RESULT = $soap->__getFunctions();
print_r($RESULT);
// uncomment that and you'll have the error
//$soap->serviceTest('bob');
}
catch (SoapFault $fault) {
echo "SOAP Fault: (faultcode: {$fault->faultcode}, faultstring: {$fault->faultstring})";
}
catch (Exception $e) {
echo $e->getMessage();
echo $e->getTraceAsString();
}
php SoapClient类可以进行基本身份验证。正如SoapClient类构造函数的文档中所述,您可以使用选项login
和password
进行基本身份验证。
$client = new SoapClient($wsdl, [
'login' => $username,
'password' => $password,
]);
仅此而已。不需要其他标头。
您必须知道,php只会在调用服务本身时发送凭据,而不会在获取wsdl文件时发送凭据。
评论后编辑
这里还有一种使用基本身份验证读取wsdl文件的方法。
$client = new SoapClient(
'http://' . urlencode($login) . ':' . urlencode($password) . '@www.server.com/path/to/wsdl',
[
'login' => $login,
'password' => $password
]
);
这也很好用。