【问题标题】:PHP SoapClient - How to Structure Soap HeaderPHP SoapClient - 如何构建 Soap 标头
【发布时间】:2014-03-24 12:42:38
【问题描述】:

在 PHP 5.3.28 中使用 SoapClient 想要创建一个如下所示的 soap 标头:

<soap:Header>
  <ns:RequestParams Size="Large" Color="Blue" Brand="xyz">
</soap:Header>

如果我这样构造标题:

    $params = array('RequestParams' => array('Size' => 'Large', 'Color' => 'Blue', 'Brand' => 'xyz');
    $header = new SoapHeader(NameSpace, 'RequestParams', $params);
    $client = new SoapClient(NULL, array("location" => "https://endpoint-url",
                                         "uri" => "http://namespace-uri",
                                         "soap_version" => SOAP_1_2, "trace" => 1));

    $client->__setSoapHeaders($header);
    $result = $client->__soapCall(some soap call here);
    echo $client->__getLastRequest() . "\n";

我得到的标题是:

<env:Header>
    <ns2:RequestParams>
        <item><key>RequestParams</key><value>
            <item><key>Size</key><value>Large</value></item>
            <item><key>Color</key><value>Blue</value></item>
            <item><key>LastName</key><value>xyz</value></item></value>
        </item>
    </ns2:RequestParams>
</env:Header>

我收到来自服务器的响应,告诉我这是一个无效的标头。我四处搜索,似乎没有太多关于 PHP soapclient 如何从数据结构创建标头的信息。知道如何使用 SoapClient 获得我想要的标题格式吗? 任何指针表示赞赏。

【问题讨论】:

标签: php soap soap-client


【解决方案1】:

使用你可以使用数组吗

$parm = array(
    'properties' => array(
        'Size' => 'Large',
        'Color' => 'Blue',
        'Brand' => 'xyz'
    ),  );

将创建这个

<properties Size="Large" Color="Blue" Brand="xyz">

【讨论】:

  • 感谢 feroz,但我得到的标题是:
    RequestParamsSize 大号颜色蓝色姓氏xyz
【解决方案2】:

找不到任何直接的方法来创建将参数作为一个节点的属性的标头。最后这行得通,虽然不是很漂亮:

$client = new SoapClient(NULL, 
                         array('location' => $loc, 'uri' => $ns, 
                               'soap_version' => SOAP_1_2, 
                               'style' => SOAP_DOCUMENT));
$headerVar = new SoapVar('<ns1:RequestParams Size="Large" Color="Blue" Brand="xyz"/>',
                          XSD_ANYXML);                   
$header = new SoapHeader($ns, 'RequestParams', $headerVar);
$client->__setSoapHeaders($header);
$result = $client->__soapCall('SomeFunc', array(...));

感谢 Feroz 提出答案,如果您在 __soapCall 中发送参数,whitch btw 可以工作,只是在创建标头时不起作用。

也感谢 cb 的解决方案:http://www.php.net/manual/en/soapvar.soapvar.php#91961

【讨论】:

    【解决方案3】:

    怎么样

    $headers = 
            [ 
               "Content-Type: text/xml; charset=utf-8",
               "Accept: text/xml",
               "Cache-Control: no-cache",
               "Pragma: no-cache",
               "SOAPAction:" . '"' . $soapAction . '"',
               "Content-length: " . strlen($xml)
           ];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多