PHP更改SOAP NameSpace

时间:2011-05-06 03:32:25

标签: php soap namespaces

我正在尝试更改命名空间,因为它需要匹配它尝试调用的.NET Web服务命名空间,但无法实现。如何更改名称空间?

class MSWCF extends SoapClient
{
    function __doRequest($request, $location, $action, $version, $one_way = 0) 
    {
        /*
         * $request is a XML string representation of the SOAP request
         * that can e.g. be loaded into a DomDocument to make it modifiable.
         */

        $domRequest = new DOMDocument();
        $domRequest->loadXML($request);

        // modify XML using the DOM API, e.g. get the <s:Header>-tag 
        // and add your custom headers
        $xp = new DOMXPath($domRequest);
        $xp->registerNamespace('SOAP-ENV', 'http://schemas.xmlsoap.org/soap/envelope/');
        // fails if no <s:Header> is found - error checking needed
        $envelope = $xp->query('/SOAP-ENV:Envelope')->item(0);

        // now add your custom header
        $header = $domRequest->createElement('SOAP-ENV:header');
        $security = $domRequest->createElement('o:Security');
        $usernameToken = $domRequest->createElement('o:UsernameToken');
        $usernameTokenuid = new DOMAttr('u:Id','uuid-4d9bf7e6-da00-4f72-8383-6037f12a0fb5-5');
        $username = $domRequest->createElement('o:Username','');
        $password = $domRequest->createElement('o:Password','');
        $passwordtype = new DOMAttr('Type','http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText');
        $password->appendChild($passwordtype); 
        $usernameToken->appendChild($username);
        $usernameToken->appendChild($password);
        $usernameToken->appendChild($usernameTokenuid);

    $timestamp = $domRequest->createElement('u:TimeStamp');
    $timestampuid = new DOMAttr('u:Id','_0');

    $interval = new DateInterval("PT5M");
    $dateCreated = new DateTime();
    $dateExpires = new DateTime();
    $dateExpires->add($interval);
    $created = $domRequest->createElement('u:Created', $dateCreated->format(DATE_ISO8601));
    $expires = $domRequest->createElement('u:Expires', $dateExpires->format(DATE_ISO8601));
    $timestamp->appendChild($timestampuid); 
    $timestamp->appendChild($created);  
    $timestamp->appendChild($expires);  

    $security->appendChild($timestamp);
    $security->appendChild($usernameToken);

    $securitymust = new DOMAttr('SOAP-ENV:mustUnderstand','1');
    $securityxml= new DOMAttr('xmlns:o','http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd');
    $security->appendChild($securitymust);
    $security->appendChild($securityxml);

        $header->appendChild($security);
    $envelope->appendChild($header);

        $request = $domRequest->saveXML();

    echo $request;

        return parent::__doRequest($request, $location, $action, $version, $one_way = 0);
    }
}

1 个答案:

答案 0 :(得分:0)

如果您的SOAP消息实际使用了命名空间,则可以使用SoapVar()指定特定变量的名称空间。当SoapClient构建消息时,它应该包含命名空间。