【问题标题】:PHP Namespaces in SoapHeader Child NodesSoapHeader 子节点中的 PHP 命名空间
【发布时间】:2012-11-08 01:06:05
【问题描述】:

PHP SoapClient 标头。我在获取子节点中的命名空间时遇到问题。这是我正在使用的代码:

$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:

<ns2:Security>
  <UsernameToken>
    <Password>MyPassword</Password>
    <Username>MyUsername</Username>
  </UsernameToken>
</ns2:Security>

这是我希望它生成的 XML:

<ns2:Security>
  <ns2:UsernameToken>
    <ns2:Password>MyPassword</ns2:Password>
    <ns2:Username>MyUsername</ns2:Username>
  </ns2:UsernameToken>
</ns2:Security>

我需要将命名空间引用放入 UsernameToken、Password 和 Username 节点。任何帮助将不胜感激。

谢谢。

【问题讨论】:

    标签: php xml namespaces soapheader


    【解决方案1】:

    David 具有right answer。他也是对的,这需要太多的努力和思考。这是一个变体,它封装了任何使用此特定 wsse 安全标头的人的丑陋之处。

    清理客户端代码

    $client = new SoapClient('http://some-domain.com/service.wsdl');
    $client->__setSoapHeaders(new WSSESecurityHeader('myUsername', 'myPassword'));
    

    以及实施...

    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);
        }
    
    }
    

    【讨论】:

    • 谢谢,我使用了这个,但将密码部分更改为:new SoapVar($password, XSD_STRING, 'type', 'docs.oasis-open.org/wss/2004/01/…', 'Password', $wsseNamespace)),它为您提供: 你的密码
    【解决方案2】:

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

    $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);
    

    这完全花费了太多的努力和思考......

    【讨论】:

      猜你喜欢
      • 2018-08-08
      • 2015-03-13
      • 1970-01-01
      • 2016-06-09
      • 2018-07-06
      • 2022-08-18
      • 1970-01-01
      • 1970-01-01
      • 2012-06-05
      相关资源
      最近更新 更多