wil*_*lth 6 php soap php4 nusoap
我正在尝试使用nuSOAP访问WebService(因为我在这里绑定了PHP4),它在消息中使用了多个命名空间.那可能吗?
示例请求消息如下所示:
<soapenv:Envelope ...
xmlns:ns1="http://domain.tld/namespace1"
xmlns:ns2="http://domain.tld/namespace2">
<soapenv:Header/>
<soapenv:Body>
<ns1:myOperation>
<ns2:Person>
<ns2:Firstname>..</ns2:Firstname>
..
</ns2:Person>
<ns1:Attribute>..</ns1:Attribute>
</ns1:myOperation>
</soapenv:Body>
</soapenv:Envelope>
Run Code Online (Sandbox Code Playgroud)
我试着跟随:
$client = new nusoap_client("my.wsdl", true);
$params = array(
'Person' => array(
'FirstName' => 'Thomas',
..
),
'Attribute' => 'foo'
);
$result = $client->call('myOperation', $params, '', 'soapAction');
Run Code Online (Sandbox Code Playgroud)
希望nuSOAP尝试将这些名称与正确的名称空间和节点相匹配.然后我尝试使用soapval()来生成元素及其命名空间 - 但是如果我调用一个操作,nuSOAP会创建以下请求:
<SOAP-ENV:Envelope ...>
<SOAP-ENV:Body>
<queryCCApplicationDataRequest xmlns="http://domain.tld/namespace1"/>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Run Code Online (Sandbox Code Playgroud)
因此在"匹配"阶段出现问题.
在尝试匹配之后,我发现了两种可能的解决方案:
1)不要使用WSDL创建nusoap_client和soapval()来创建消息.这样做的缺点是消息包含大量开销(命名空间在每个元素中定义).不太好.
2)不是依赖于参数的匹配,而是在xml中构造你的回复并将前缀的所有定义放在第一个元素中 - 例如
$params = "<ns1:myOperation xmlns:ns1="..." xmlns:ns2="...">
<ns2:Person>
<ns2:Firstname>..</ns2:Firstname>
..
</ns2:Person>
<ns1:Attribute>..</ns1:Attribute>
</ns1:myOperation>";
Run Code Online (Sandbox Code Playgroud)
仍然不是一个非常好的解决方案,但它的工作原理:-)
| 归档时间: |
|
| 查看次数: |
15019 次 |
| 最近记录: |