15

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 ノードに取得する必要があります。どんな助けでも本当にありがたいです。

ありがとう。

4

2 に答える 2

14

デビッド正しい答えを持っています。そして、それにはあまりにも多くの労力と思考が必要だという彼の意見も正しい。これは、この特定の 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);
    }

}
于 2013-12-10T15:35:08.340 に答える
12

理解した。ネストされた SoapVar と配列を使用しました。

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

それは完全にあまりにも多くの労力と考えを必要としました...

于 2012-11-20T16:17:03.570 に答える