【问题标题】:How to add attribute onto a SoapHeader node using php Soap library如何使用 php Soap 库将属性添加到 SoapHeader 节点
【发布时间】:2014-06-23 00:46:55
【问题描述】:

如何使用 php 的 Soap 库在 Soap 头中的节点上添加属性?

尝试了所有可用的示例(StackOverflow 和 php.net 上的所有示例(示例、cmets 等)。

$a = ['_'=> 'bar', 'id' => 1, 'val' => 'foo'];
$x = new SoapVar($a,SOAP_ENC_OBJECT);
$h = new SoapHeader('http://www.w3.org/2003/05/soap-envelope','FFS', $x);

这会导致:

    <env:FFS>
        <_>bar</_>
        <id>1</id>
        <val>foo</val>
    </env:FFS>

附加:属性应该命名空间。在没有属性的情况下将命名空间节点添加到正文和/或标题不是问题。给节点添加属性是个问题。

最后我需要得到的结果节点应该是这样的

<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:nsx="http://example.com">
    <env:Header>
        <node nsx:foo="bar">
            <nsx:baz>bam</nsx:baz>
        </node>
    </env:Header>
    <env:Body>
        [ snip ]
    </env:Body>
</env:Envelope>

注意:由于到目前为止我发现的所有示例/提示都建议手动构建节点或使用 RAW XML,因此我必须强调以下几点:

  • 我不想使用 XSD_ANYXML,
  • 我不想使用 SimpleXML 和/或 DOMElement 创建节点。
  • 我会接受其他 SOAP 库的建议,以便我轻松构建调用。

【问题讨论】:

  • 对不起,但我认为这是不可能的。您可能需要为此查看一些 XML 库。
  • 是的,通过进一步调查,我还得出结论,内置库无法做到这一点。

标签: php soap attributes namespaces soapheader


【解决方案1】:

找到了一种在 WSDL 模式下的方法:

class FromSystemId {
    protected $_ = "Bla bla bla";
    protected $ID = "999";
}

class Auth {
/**
 * @var FromSystemId
 */
protected $FromSystemId;

/**
 * @var string
 */
protected $UserName;

/**
 * @var string
 */
protected $Password;

/**
 * Auth constructor.
 * @param FromSystemId $FromSystemId
 * @param string $UserName
 * @param string $Password
 */
public function __construct(FromSystemId $FromSystemId, $UserName, $Password)
{
    $this->FromSystemId = $FromSystemId;
    $this->UserName = $UserName;
    $this->Password = $Password;
}
}

try {

$soap = new SoapClient("some.wsdl", [
        "location" => "some soap api url",
        "soap_version" => SOAP_1_1,
        "trace" => true,
        "cache_wsdl" => WSDL_CACHE_NONE,
        "classmap" => [
            "Auth" => "Auth",
            "FromSystemId" => "FromSystemId",
        ]
]);


$auth = new Auth(new FromSystemId(), "user", "password");
$soap->__setSoapHeaders(new SoapHeader("ns", "Auth", $auth));

结果将是:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
               xmlns:ns1="aa"
               xmlns:ns2="bb">
<SOAP-ENV:Header>
    <ns2:Auth xsi:type="ns1:Auth">
        <ns1:FromSystemId ID="999">Bla bla bla</ns1:FromSystemId>
        <ns1:UserName>user</ns1:UserName>
        <ns1:Password>password</ns1:Password>
    </ns2:Auth>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
    <ns1:GetCountriesRQ/>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

【讨论】:

  • 不幸的是,这不是想要的结果。节点应该看起来像 或类似的东西。
  • 以上示例不返回发布的结果。 FromSystemId 将包含 2 个标签:&lt;ID&gt;999&lt;/ID&gt;&lt;_&gt;Bla Bla Bla&lt;/_&gt;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-16
  • 2016-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多