我必须调用需要基本身份验证的soap WebService。我尝试了带有基本身份验证的SoapUI及其工作方式。可以从浏览器正确加载WSDL页面。没有与SSL相关的问题。
我正在尝试与SoapClient进行相同的呼叫,但无法正常工作。据我了解(在Burp Software的帮助下)身份验证标头不是与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
)
答案 0 :(得分:1)
我设法在wsdl请求中不包含登录名/密码的情况下获得了服务列表,所以soapclient正在与此服务器一起工作。
使用登录名和密码时出现500错误,因此在服务器端似乎是一个问题。
以下代码可帮助您获得有关肥皂响应的更多详细信息
<?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();
}
答案 1 :(得分:0)
php SoapClient类可能具有基本的身份验证。如documentation中对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
]
);
这也很好。