我有以下代码来调用共享点数据的NTLM认证:
class NTLMSoapClient extends SoapClient {
/**
* Whether or not to validate ssl certificates
*
* @var boolean
*/
function __construct($location, $user, $passwd)
{
//print '1';
$headers = array(
'Method: POST',
'Connection: Keep-Alive',
'User-Agent: PHP-SOAP-CURL',
'Content-Type: text/xml; charset=utf-8',
'SOAPAction: ""',
);
$request='';
//$this->__last_request_headers = $headers;
$ch = curl_init($location);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER , $headers);
//print '2';
curl_setopt($ch, CURLOPT_POST , true );
curl_setopt($ch, CURLOPT_POSTFIELDS , $request);
curl_setopt($ch, CURLOPT_HTTP_VERSION , CURL_HTTP_VERSION_1_1);
// the next option may or may not cause issues with non-XML documents
//curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_NTLM);
curl_setopt($ch, CURLOPT_USERPWD, $user.':'.$passwd);
//print '3';
// optional SSL verification
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$response = curl_exec($ch);
print $response;
// TODO: Add some real error handling.
// If the response if false than there was an error and we should throw
// an exception.
if ($response === false) {
//print '5';
throw new EWS_Exception(
'Curl error: ' . curl_error($ch),
curl_errno($ch)
);
}
//print '6';
return $response;
}
}
调用如下:
try{
$this->soapObject = new NTLMSoapClient( $this->wsdl, $this->spUser, $this->spPass);
}catch(SoapFault $fault){
//If we are unable to create a Soap Client display a Fatal error.
throw new Exception("Unable to locate WSDL file.");
}
响应将以wsdl的形式发布。为什么响应会像wsdl一样出现。它应该像普通的肥皂客户端调用一样返回soap客户端对象数组。任何帮助表示赞赏。
感谢。
答案 0 :(得分:3)
以下是示例代码的简化版本:
class NTLMSoapClient extends SoapClient {
function __construct($location, $user, $passwd) {
$ch = curl_init($location);
$response = curl_exec($ch);
print $response;
return $response;
}
}
$this->soapObject = new NTLMSoapClient( $this->wsdl, $this->spUser, $this->spPass);
请注意以下事项:
SoapClient
一样,您传递wsdl网址作为第一个参数。$location
。curl_init
中,您传入$location
(这是在实例化对象时传入的wsdl网址)。curl_exec()
回复存储为$response
print $resposne;
并假设这是故障排除,对象构造函数的最终操作是将$response
变量返回到实例化NTLMSoapClient
类的变量。 考虑到上述所有因素......
一个。您的类更像是一个函数,因为创建对象只会导致返回curl响应(该对象实际上不再是对象,而是包含响应的字符串)。充其量这可以被认为是一种“静态构造函数”。
湾已设置为返回字符串的变量以后无法调用NTLMSoapClient
类的方法,因为它只是一个字符串。
℃。您总是传入wsdl url,因此响应将始终是该url返回的内容,即您通过curl请求请求的wsdl。
d。我不认为构造函数应该返回任何东西,而不是实例化类的对象。
即本机SoapClient
不会返回任何内容,因此您应该尝试将扩展类建模为更接近父类。
F。即使这确实有效(意味着有一些关于OOP和PHP的东西我不明白这涉及),你的例子只显示请求初始wsdl的NTLMSoapClient
,没有任何后续示例代码显示它调用a Web服务的方法或其他任何东西,那么在您的示例代码中,您期望除wsdl以外的任何其他内容?
克。最后,以积极的方式结束我希望鼓励您继续朝着您的总体目标努力,您确定的一件事是扩展类返回wsdl,这意味着您通过NTLM成功验证了服务服务器如果我理解代码和你的问题的想法,那就是你的目标的前半部分。