首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SoapHeader子节点中的PHP

SoapHeader子节点中的PHP
EN

Stack Overflow用户
提问于 2012-11-20 09:12:27
回答 2查看 8.9K关注 0票数 15

PHP SoapClient头文件。我在获取子节点中的名称空间时遇到了问题。下面是我使用的代码:

代码语言:javascript
复制
$security = new stdClass;
$security->UsernameToken->Password = 'MyPassword';
$security->UsernameToken->Username = 'MyUsername';
$header[] = new SOAPHeader('http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd', 'Security', $security);
$client->__setSoapHeaders($header);

下面是它生成的XML:

代码语言:javascript
复制
<ns2:Security>
  <UsernameToken>
    <Password>MyPassword</Password>
    <Username>MyUsername</Username>
  </UsernameToken>
</ns2:Security>

下面是我希望它生成的XML:

代码语言:javascript
复制
<ns2:Security>
  <ns2:UsernameToken>
    <ns2:Password>MyPassword</ns2:Password>
    <ns2:Username>MyUsername</ns2:Username>
  </ns2:UsernameToken>
</ns2:Security>

我需要将名称空间引用到UsernameToken、Password和Username节点中。任何帮助都将不胜感激。

谢谢。

EN

回答 2

Stack Overflow用户

发布于 2013-12-10 23:35:08

right answerDavid那里。他也说得对,这需要付出太多的努力和思考。这里有一个变体,它为任何使用这个特定的wsse安全头的人封装了丑陋的东西。

干净客户端代码

代码语言:javascript
复制
$client = new SoapClient('http://some-domain.com/service.wsdl');
$client->__setSoapHeaders(new WSSESecurityHeader('myUsername', 'myPassword'));

及其实现...

代码语言:javascript
复制
class WSSESecurityHeader extends SoapHeader {

    public function __construct($username, $password)
    {
        $wsseNamespace = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd';
        $security = new SoapVar(
            array(new SoapVar(
                array(
                    new SoapVar($username, XSD_STRING, null, null, 'Username', $wsseNamespace),
                    new SoapVar($password, XSD_STRING, null, null, 'Password', $wsseNamespace)
                ), 
                SOAP_ENC_OBJECT, 
                null, 
                null, 
                'UsernameToken', 
                $wsseNamespace
            )), 
            SOAP_ENC_OBJECT
        );
        parent::SoapHeader($wsseNamespace, 'Security', $security, false);
    }

}
票数 14
EN

Stack Overflow用户

发布于 2012-11-21 00:17:04

我想通了。我使用了嵌套的SoapVars和数组。

代码语言:javascript
复制
$ns_s = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd';
$node1 = new SoapVar('MyUsername', XSD_STRING, null, null, 'Username', $ns_s);
$node2 = new SoapVar('MyPassword', XSD_STRING, null, null, 'Password', $ns_s);
$token = new SoapVar(array($node1,$node2), SOAP_ENC_OBJECT, null, null, 'UsernameToken', $ns_s);
$security = new SoapVar(array($token), SOAP_ENC_OBJECT, null, null, 'Security', $ns_s);
$header[] = new SOAPHeader($ns_s, 'Security', $security, false);

这花费了太多的精力和心思。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13465168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档