没有收到NTLM身份验证+ soap客户端+响应

时间:2013-01-08 11:47:29

标签: php web-services sharepoint soap ntlm

我有以下代码来调用共享点数据的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客户端对象数组。任何帮助表示赞赏。

感谢。

1 个答案:

答案 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);

请注意以下事项:

  1. 与父SoapClient一样,您传递wsdl网址作为第一个参数。
  2. 在构造函数中,将wsdl url映射到参数$location
  3. curl_init中,您传入$location(这是在实例化对象时传入的wsdl网址)。
  4. 您将curl_exec()回复存储为$response
  5. 忽略print $resposne;并假设这是故障排除,对象构造函数的最终操作是将$response变量返回到实例化NTLMSoapClient类的变量。
  6. 考虑到上述所有因素......

    一个。您的类更像是一个函数,因为创建对象只会导致返回curl响应(该对象实际上不再是对象,而是包含响应的字符串)。充其量这可以被认为是一种“静态构造函数”。

    湾已设置为返回字符串的变量以后无法调用NTLMSoapClient类的方法,因为它只是一个字符串。

    ℃。您总是传入wsdl url,因此响应将始终是该url返回的内容,即您通过curl请求请求的wsdl。

    d。我不认为构造函数应该返回任何东西,而不是实例化类的对象。

    即本机SoapClient不会返回任何内容,因此您应该尝试将扩展类建模为更接近父类。

    F。即使这确实有效(意味着有一些关于OOP和PHP的东西我不明白这涉及),你的例子只显示请求初始wsdl的NTLMSoapClient,没有任何后续示例代码显示它调用a Web服务的方法或其他任何东西,那么在您的示例代码中,您期望除wsdl以外的任何其他内容?

    克。最后,以积极的方式结束我希望鼓励您继续朝着您的总体目标努力,您确定的一件事是扩展类返回wsdl,这意味着您通过NTLM成功验证了服务服务器如果我理解代码和你的问题的想法,那就是你的目标的前半部分。