【问题标题】:SOAP Request Header is not well-formatted (Contains <item>, <key> and <value>)SOAP 请求标头格式不正确(包含 <item>、<key> 和 <value>)
【发布时间】:2013-09-26 09:24:55
【问题描述】:

我的 SOAP 请求的标头以一种奇怪的格式显示。我需要一个看起来像这样的标题:

<soap-env:header>
    <wsse:security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
        <wsse:usernametoken wsu:id="UsernameToken-45">
            <wsse:username>817221</wsse:username>
            <wsse:password type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">1234</wsse:password>
        </wsse:usernametoken>
    </wsse:security>
    </soap-env:header>

现在,标题看起来像这样:

<SOAP-ENV:Header>
    <ns8:Security SOAP-ENV:mustUnderstand="1">
        <item>
            <key>UsernameToken</key>
            <value>
                <item>
                    <key>Username</key>
                    <value>817221</value>
                </item>
                <item>
                    <key>Password</key>
                    <value>
                        <item>
                            <key>_</key>
                            <value>1234</value>
                        </item>
                        <item>
                            <key>Type</key>
                            <value>http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText</value>
                        </item>
                    </value>
                </item>
            </value>
        </item>
    </ns8:Security>
</SOAP-ENV:Header>

大错特错。它包含和标签。我已经读过应该使用 SOAP_ENC_OBJECT 以正确的格式显示它,所以我在我的代码中尝试了它,但仍然无法正常工作。请看下面的代码:

$header = array(
            'UsernameToken' => array(
                'Username' => 817221,
                'Password' => array(
                        '_' => 1234,
                        'Type' => 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText')));

$headerSoapVar = new SoapVar($header,SOAP_ENC_OBJECT); 
$soapheader = new SoapHeader('http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd', "Security" , $header, true);
$client->__setSoapHeaders($soapheader);

任何帮助将不胜感激。谢谢!

【问题讨论】:

    标签: php web-services soap soap-client soapheader


    【解决方案1】:

    这是一个很老的问题!

    但是,我今天遇到了同样的问题!

    我发现“header”需要是一个对象,而不是一个数组!

    但是我仍然有命名空间的问题......所以我解决了子类化 SoapClient 类

    class MySoapClient extends SoapClient {
    
        public function __doRequest($request, $location, $action, $version, $one_way=0) {
            // manipulate $request var using XML parse tools or whatever !!
            return parent::__doRequest($request, $location, $action, $version, $one_way);
        }
    }
    

    我仍在解决这个问题,但我希望它对某人有所帮助!

    【讨论】:

      【解决方案2】:

      试试这个你应该把它设置为一个对象。

      $header = (object) array(
                  'UsernameToken' => array(
                      'Username' => 817221,
                      'Password' => array(
                              '_' => 1234,
                              'Type' => 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText')));
      

      【讨论】:

      • 不能使用 stdClass 类型的对象作为数组
      • @user25794 正在投射。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-05
      • 2018-02-26
      • 2017-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多