SOAP 响应正文是没有任何节点的纯文本
SOAP response body has plain text without any nodes
如何处理如下所示的 SOAP 消息响应?
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" xmlns:new="http://foo/bar">
<S:Header/>
<S:Body>OK</S:Body>
</S:Envelope>
这是我在 WSDL 中的定义:
<wsdl:operation name="MyRequest">
<wsdl:input message="tns:MyRequest" name="MyRequest">
</wsdl:input>
<wsdl:output message="tns:MyRequestResponse" name="MyRequestResponse">
</wsdl:output>
</wsdl:operation>
<xs:element name="MyRequestResponse" type="xs:string"/>
服务:
@WebMethod(operationName = "MyRequest")
@WebResult(name = "MyRequestResponse", targetNamespace = "http://foo/bar", partName = "parameters")
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
public String MyRequest(
@WebParam(name = "MyRequest", targetNamespace = "http://foo/bar", partName = "parameters")
MyRequest parameters);
我确实尝试过使用拦截器并用节点包装响应 'OK'。但是,想知道是否有更简洁的方法通过在 JAXB/WSDL 层本身中处理来做到这一点。
根据规范,这不是有效的 SOAP 1.1 Body 元素。所以它实际上不是 SOAP 响应。
因为它不是有效的 SOAP 响应并且您不发送任何复杂参数,所以尝试使用 SOAP 框架调用此类服务确实没有什么价值。
将其视为具有专有格式的普通 HTTP 服务会更有意义。发送 HTTP POST 请求并从响应中提取正文中的 "OK" 部分。如果命名空间前缀不希望改变,你甚至可以不解析XML。
尽管看起来像 "hack",但与使用不明显的拦截器和模糊设置来破解框架并强制其执行规范之外的事情相比,它是一种更加简洁和可维护的方法。任何跟随您检查代码的人都必须花时间了解处理这个独眼 SOAP 背后的所有装置。
但是,如果有时存在符合规范的有效复杂 SOAP 主体,有时存在无效的任意内容,如 OK,则重新实现 SOAP 解析是不合理的,拦截器是带来无效消息的方法符合规范。在混合情况下,我认为没有简单干净的方法来使用 SOAP/WSDL 规范进行映射,除非消息被拦截器预处理和修复。
如果您查看 here,您可以看到 SOAP 信封的基本 XSD 格式。因此,如果您将 "OK" 字符串添加到 body 中的字符串元素,这是一个字符串标记,那么您应该没问题。
<xs:element name="message" type="xs:string"/>
至于XML:
<message>OK</message>
截至目前,您的 XML 无效。 body 和 header 中的元素必须具有数据类型。
如何处理如下所示的 SOAP 消息响应?
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" xmlns:new="http://foo/bar"> <S:Header/> <S:Body>OK</S:Body> </S:Envelope>
这是我在 WSDL 中的定义:
<wsdl:operation name="MyRequest">
<wsdl:input message="tns:MyRequest" name="MyRequest">
</wsdl:input>
<wsdl:output message="tns:MyRequestResponse" name="MyRequestResponse">
</wsdl:output>
</wsdl:operation>
<xs:element name="MyRequestResponse" type="xs:string"/>
服务:
@WebMethod(operationName = "MyRequest")
@WebResult(name = "MyRequestResponse", targetNamespace = "http://foo/bar", partName = "parameters")
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
public String MyRequest(
@WebParam(name = "MyRequest", targetNamespace = "http://foo/bar", partName = "parameters")
MyRequest parameters);
我确实尝试过使用拦截器并用节点包装响应 'OK'。但是,想知道是否有更简洁的方法通过在 JAXB/WSDL 层本身中处理来做到这一点。
根据规范,这不是有效的 SOAP 1.1 Body 元素。所以它实际上不是 SOAP 响应。
因为它不是有效的 SOAP 响应并且您不发送任何复杂参数,所以尝试使用 SOAP 框架调用此类服务确实没有什么价值。
将其视为具有专有格式的普通 HTTP 服务会更有意义。发送 HTTP POST 请求并从响应中提取正文中的 "OK" 部分。如果命名空间前缀不希望改变,你甚至可以不解析XML。
尽管看起来像 "hack",但与使用不明显的拦截器和模糊设置来破解框架并强制其执行规范之外的事情相比,它是一种更加简洁和可维护的方法。任何跟随您检查代码的人都必须花时间了解处理这个独眼 SOAP 背后的所有装置。
但是,如果有时存在符合规范的有效复杂 SOAP 主体,有时存在无效的任意内容,如 OK,则重新实现 SOAP 解析是不合理的,拦截器是带来无效消息的方法符合规范。在混合情况下,我认为没有简单干净的方法来使用 SOAP/WSDL 规范进行映射,除非消息被拦截器预处理和修复。
如果您查看 here,您可以看到 SOAP 信封的基本 XSD 格式。因此,如果您将 "OK" 字符串添加到 body 中的字符串元素,这是一个字符串标记,那么您应该没问题。
<xs:element name="message" type="xs:string"/>
至于XML:
<message>OK</message>
截至目前,您的 XML 无效。 body 和 header 中的元素必须具有数据类型。