gpt4 book ai didi

php - 使用 PHP 的 SOAP 在服务器端修改发送的 XML

转载 作者:搜寻专家 更新时间:2023-10-31 22:11:18 24 4
gpt4 key购买 nike

一个关于PHP的SoapClient和SoapServer的问题,WSDL方式。

比方说,我需要用其中的数据创建 XML 某个部分的摘要。使用 SoapClient 很容易。我重载了 __doRequest()类中的方法 SoapClient , 对某些元素进行散列并将其附加为元素 <Hash></Hash><SOAP-ENV:Header/> 内.然后我将生成的 XML 发送到调用 parent::__doRequest() 的 SOAPServer .

我需要对响应 XML 执行相同的操作。在服务器端我有困难。似乎服务器只能将数据作为嵌套数组或对象发送,并且以某种方式插入到客户端的响应 XML 中。我尝试使用 SoapServer 发送 XML的响应,然后返回空 XML。

我真的需要在服务器端解析和修改 XML(制作哈希、数字签名等),但到目前为止,无论我在哪里搜索,我都没有找到如何做的答案,所以我真的很感激你帮助。谢谢。

最佳答案

你必须得到一个 没有 XML 声明的 XML 字符串,并用 SoapVar 解析它。
参见 how-return-custom-xml-response-in-soapserver-response了解详情。

总之,就是这样了。
您根据输入和需要放入其中的任何其他内容构建 DOMDocument。 XSLT 是解析和更改 XML 的好方法(请再次参阅上面的链接,了解如何在 php 中使用 xslt 的简单示例)。
然后从要返回的 DOMDocument 中选择 DOMNode,然后应用 saveXML 并将此节点作为参数。这将所需的 XML 保存为字符串没有声明。不带参数的普通 saveXML() 会将根节点保存为字符串包括声明。因此:

$nodes = $dom -> getElementsByTagName ('chooseTheElementYouWishToReturn');
$node = $nodes -> item(0);

$result = new SoapVar ($dom -> saveXML($node), XSD_ANYXML);
return ($result);

当然,当您希望返回根元素时,这也有效:

$result = new SoapVar ($dom -> saveXML($dom -> documentElement), XSD_ANYXML);
return ($result);

添加

我注意到您希望向 SOAP header 而不是正文添加一些内容。
这也有点棘手,但可以实现 - 我希望以下内容能满足您的需求。

首先,添加 header 详细信息只能在函数脚本内完成,然后函数必须将服务器变量声明为全局变量,以便引用全局(函数外)声明的变量,如下所示:

<?php   
class mySOAPclass {
function xxx ($arg) {
global $server;

// your code for the header part
// example
$auth = array();
$auth['UserName'] = 'user';
$auth['Password'] = 'pw';
$header = new SoapVar ($auth, SOAP_ENC_OBJECT);
// end example

$header = new SoapHeader ('http://schemas.xmlsoap.org/soap/header/', 'credentials', $header, false);
$server -> addSoapHeader ($header);

// your code for the body part, assuming it results in a DOM $dom

$result = new SoapVar ($dom -> saveXML($dom -> documentElement), XSD_ANYXML);

return ($result);
}

ini_set( "soap.wsdl_cache_enabled", "0");
$server = new SoapServer ("yourOwn.wsdl");
$server -> setClass ('mySOAPclass');
$server -> setObject (new mySOAPclass());
$server -> handle();
?>

注意,需要先从数组构造一个SoapVar;如果您直接将数组提供给 header ,您会得到丑陋的项目/键和项目/值节点。

以上内容导致以下返回结构:

<SOAP-ENV:Envelope 
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns1="http://schemas.xmlsoap.org/soap/header/">
<SOAP-ENV:Header>
<ns1:credentials>
<UserName>user</UserName>
<Password>pw</Password>
</ns1:credentials>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
...
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

关于php - 使用 PHP 的 SOAP 在服务器端修改发送的 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12655219/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com