- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在设置一个 SOAP 网络服务,它接受 XML 输入并且必须返回自定义 XML 输出。所有这些都在 WSDL 中定义。我为此应用了 soapServer(直到有人说它有错误阻止我实现我的目标:-))。
我还不能返回自定义 XML:我得到了一些似乎基于 WSDL 的结果,标准根元素名称等于输入 XML 加上“Response”。事实上,这也让我感到惊讶,所以作为一个附带问题,我想知道为什么会这样以及它是否会受到影响。当然,在创建响应时以某种方式使用 WSDL 定义是件好事,但正如我所说,我不知道如何在响应中获取自定义 XML。
我做到了这一点:
WSDL
<?xml version="1.0" encoding="UTF-8"?>
<definitions
xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns="http://pse/"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
name="PSE"
targetNamespace="http://pse/">
<types>
<xs:schema>
<xs:import namespace="http://pse/" schemaLocation="PSE.xsd"/>
</xs:schema>
</types>
<message name="MI102Req">
<part name="cdhead" type="tns:cdhead_T"/>
<part name="instr" type="tns:instr_T"/>
</message>
<message name="Res">
<part name="cdhead" type="tns:cdhead_T"/>
</message>
<portType name="MIPortType">
<operation name="mi102">
<input message="tns:MI102Req"/>
<output message="tns:Res"/>
</operation>
</portType>
<binding name="MIBinding" type="tns:MIPortType">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="mi102">
<soap:operation soapAction="http://www.testURL/test_soap.php#mi102"/>
<input>
<soap:body use="literal" namespace="http://pse/"/>
</input>
<output>
<soap:body use="literal" namespace="http://pse/"/>
</output>
</operation>
</binding>
<service name="PSE">
<port name="MIPortType" binding="tns:MIBinding">
<soap:address location="http://www.testURL/test_soap.php"/>
</port>
</service>
</definitions>
输入 XML
<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">
<Body>
<mi102 xmlns="http://pse">
<cdhead version="13"/>
<instr/>
</mi102>
</Body>
</Envelope>
当前的 php
<?php
class PSE {
function mi102 ($stdClassInput) {
$inp = file_get_contents ('php://input');
$xml = simplexml_load_string ($inp); // Envelope
$ch = $xml -> children ();
$elt1 = $ch [0]; // Body
$ch = $elt1 -> children ();
$elt2 = $ch [0]; //mi102
$xslt = new XSLTProcessor();
$xslt -> registerPHPFunctions();
$xslt -> importStylesheet ( DOMDocument::load ('test.xslt') );
$dom = $xslt -> transformToDoc (DOMDocument::loadXML ($elt2 -> asXML()));
$result = new SoapVar ($dom -> saveXML(), XSD_ANYXML);
return ($result);
}
}
ini_set( "soap.wsdl_cache_enabled", "0");
$server = new SoapServer ("test.wsdl");
$server -> setClass ('PSE');
$server -> setObject (new PSE());
$server -> handle();
?>
上面使用的 XSLT 只是一个更改属性的方法 - 并且临时将根名称更改为服务器始终返回的名称(以防万一:-))
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:pse="http://pse">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="pse:mi102">
<mi102Response>
<xsl:apply-templates/>
</mi102Response>
</xsl:template>
<xsl:template match="pse:cdhead">
<xsl:copy>
<xsl:apply-templates select="@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@*">
<xsl:copy/>
</xsl:template>
<xsl:template match="@version">
<xsl:attribute name="version">14</xsl:attribute>
</xsl:template>
<xsl:template match="*"/>
</xsl:stylesheet>
我希望返回的 XML 类似于
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://pse/">
<SOAP-ENV:Body>
<ns1:mi102Response>
<cdhead version="14"/>
</ns1:mi102Response>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
而是它是
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://pse/">
<SOAP-ENV:Body>
<ns1:mi102Response/>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
在上面的 php 中调试 $dom 内容准确地显示了我尝试返回的 XML(包装在 SOAP 信封/主体中,当然,就像输入的一样):
<?xml version="1.0" encoding="UTF-8"?>
<mi102Response xmlns:pse="http://pse">
<cdhead xmlns="http://pse" version="14"/>
</mi102Response>
我哪里出错了?如何将自定义 XML 放入返回的 http 响应内容中?
最佳答案
呸!
这花了我几次重试和谷歌搜索,直到我发现问题所在。
我认为它可以归类为 SoapVar
中的错误.
我发现虽然 SoapVar 完全能够解析 XML 字符串,但如果字符串包含类似 <?xml version="1.0" encoding="UTF-8"?>
的 XML 声明,它就无法解析。 .所以当你有一个 DOMDocument
或 SimpleXMLElement
,您首先必须在通过 SoapVar 解析字符串之前剥离声明。
对于 DOMDocument
这可以通过应用 saveXML
来完成参数等于 DOMNode
从 dom 本身构建的变量,选择任何节点,但通常这当然是根节点。
在我的服务器 php 中,我添加了以下内容:
$nodes = $dom -> getElementsByTagName ('cdhead');
$node = $nodes -> item(0);
$result = new SoapVar ($dom -> saveXML($node), XSD_ANYXML);
现在我的结果好了:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://pse/">
<SOAP-ENV:Header/>
<SOAP-ENV:Body>
<ns1:mi102Response>
<cdhead version="14"/>
</ns1:mi102Response>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
至于返回的 XML 的根名称 - 我相信我会找到一种方法将其更改为我想要的任何名称(而不是 SoapVar 生成的标准 mi102Response)!!
关于php - 如何在 soapServer 响应中返回自定义 XML 响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12736697/
是否可以将 Delphi SoapServer 应用程序转换为使用 TCP/IP? 最佳答案 从您的评论到您的问题,听起来您正在寻找摆脱 SOAP,并使用其他东西通过 TCP/IP 连接进行通信。 可
我已经在其他地方看到这个问题的答案,但我仍然无法解决这个问题,所以我需要进一步说明: 给出的例子是: $tag['_'] = 'yyy'; $tag['attr'] = 'xxx'; $tagVar
我正在使用 PHP 的 SoapServer 类构建 Web 服务。使用 classmap 功能效果很好,并且 WSDL 类型正确映射到 PHP 类型。但是,我无法弄清楚映射类的实例是如何创建的。 有
我正在使用 PHP 中的 SoapServer 开发网络服务。以前,我使用完全相同的技术制作了另一个网络服务。我的新项目在同一台服务器上,但在另一个子目录中。在服务和 soapserver 的 url
我想发送一个纯 xml 的 soap 响应,即没有 soap 信封。这是我目前的回应 false
我正在阅读 php 类 SoapServer 的文档,但没有找到任何关于将在 SoapServer 构造函数中传递的选项的描述: 还有一个功能选项可以设置为 SOAP_WAIT_ONE_WAY_CAL
与编写DataSnap相比,使用DataSnap有哪些优势?肥皂服务器应用程序。 我知道Datasnap 可以使用TCP/IP 代替soap。 问候 桑迪普 最佳答案 使用 DataSnap,您可以导
是否有任何/所有异常是 PHP SoapServer可能会在任何地方记录下来? (意味着构建的是 SoapServer 的 native PHP 实现,而不是基于第三方 PHP 的实现) 如果不是,是
我正在尝试使用 native SoapServer 类在 PHP 中创建一个简单的 SOAP 网络服务:http://www.php.net/manual/en/class.soapserver.ph
我正在尝试在代理后面同时运行 PHP SoapClient 和 SoapServer(用于 Magento),其中唯一允许通过代理服务器的网络流量。 我已经和客户一起工作了: $client = ne
我需要在 Soap 响应中添加一个命名空间。我正在使用 php 和 SoapServer。我的回答是这样开始的: 我需要它像这样开始: 我在PHP中的代码是这样的,我不知道如何继续: class
我正在创建一个 SOAP 服务器(在 Symfony 中使用 ckWebservicePlugin),它需要符合以下请求和响应结构(我得到的是一个已经商定的规范)。 请求:
我有一个基于 symfony 的产品,我必须在其中公开一个 Soap API。我已经创建了 wsdl 文件,在输入用户名和密码进行基本的 http 身份验证检查后,可以从浏览器访问该文件。 当我使用
所以错误是: PHP fatal error :过程“sup:set_availability”不存在于 XMLSoapServer.php 中 我在我的开发环境 (MAMP) 上收到此错误。 这是由
我正在设置一个 SOAP 网络服务,它接受 XML 输入并且必须返回自定义 XML 输出。所有这些都在 WSDL 中定义。我为此应用了 soapServer(直到有人说它有错误阻止我实现我的目标:-)
我正在设置一个 SOAP 网络服务,它应该返回一个复合消息。 此消息的有效实例如下: x1 w1
我使用 PHP 5.3 创建了一个基于 WSDL 的 SOAP Web 服务。我使用 Zend Framework 来处理服务,而 ZF 又位于 PHP 的内置 SoapServer 类之上。 在使用
我们已经构建了一个 SOAP 服务来接收请求,但是给出的响应需要包含一个附加值,我们不知道如何添加它。 我们需要添加 xmlns="http://some-url.co.uk/"进入这个: 所以它读
在“创建服务端”方面,我对 Soap 比较陌生,所以对于我正在使用的任何术语,请提前表示歉意。 是否可以从使用 PHP 的 SoapServer 类设置的远程过程 Soap 服务返回 PHP 数组?
我有一个由 java 中的网络服务生成的 WSDL,我需要在 php 应用程序中复制相同的网络服务。 我看了看,我发现的大多数脚本都只是生成客户端。我需要将被消耗的服务器端。 最佳答案 如果您有 WS
我是一名优秀的程序员,十分优秀!