【问题标题】:SOAP response body has plain text without any nodesSOAP 响应正文包含没有任何节点的纯文本
【发布时间】:2016-11-28 08:59:47
【问题描述】:

如何处理如下所示的 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 层本身进行处理。

【问题讨论】:

  • 您是否尝试生成或使用 OK 响应?
  • 我正在尝试从 Mule ESB 中使用它。
  • 根据您的 WSDL,此 SOAP 响应无效。你应该有类似的东西: schemas.xmlsoap.org/soap/envelope" xmlns:new="foo/bar">
    @Cyril:我无法控制响应。我只是在消费它。您能否帮助为给定的 SOAP 响应构建 WSDL?谢谢。
  • 您能否展示来自服务提供商的完整原始 WSDL(给您此响应的那个)?您是否直接从中生成了客户端代码?您是否使用 Apache CXF 作为客户端的 JAX-WS 实现(我不知道 Mule ESB,但从文档看来它似乎是 CXF)?使用响应时遇到什么错误?

标签: java web-services soap jaxb wsdl


【解决方案1】:

根据规范,这不是一个有效的SOAP 1.1 Body 元素。所以它实际上不是 SOAP 响应。

因为它不是一个有效的 SOAP 响应并且您不发送任何复杂的参数,所以尝试使用 SOAP 框架调用这样的服务确实没有什么价值。

将其视为具有专有格式的纯 HTTP 服务会更有意义。发送 HTTP POST 请求并从响应中提取正文中的“OK”部分。如果名称空间前缀预计不会更改,即使不解析 XML 也可以更改。

尽管看起来像“hack”,但它比使用不明显的拦截器和晦涩的设置来破解框架并强制它执行规范之外的事情是一种更干净和可维护的方法。任何追随你、检查代码的人都必须花时间了解处理这个单眼 SOAP 背后的所有装置。

但是,如果有时存在符合规范的有效复杂 SOAP 主体,有时存在无效的任意内容(如 OK),则重新实现 SOAP 解析是不合理的,拦截器是可行的方法,将无效消息内联规范。在混合情况下,我认为没有简单干净的方法来使用 SOAP/WSDL 规范进行映射,除非消息被拦截器预处理和修复。

【讨论】:

    【解决方案2】:

    如果您查看here,您可以看到 SOAP 信封的基本 XSD 格式。所以如果你把你的“OK”字符串添加到正文中的一个字符串元素中,这是一个字符串标签,那么你应该没问题。

    <xs:element name="message" type="xs:string"/>
    

    关于 XML:

    <message>OK</message>
    

    到目前为止,您的 XML 无效。正文和标题中的元素必须具有数据类型。

    【讨论】:

    • HanuAthena 已经在 cmets 中解释过,无法控制收到的响应。你在这里写的,两天前就已经提出来了。
    • 啊没看到 - 它是评论而不是答案。
    • 无论如何 - 你不能期望运行一个接受无效 xml 作为输入的soap端点
    • 是的,您需要在消息处理之前拦截并纠正无效响应(如果有可能复杂的消息难以解析) - 已经完成 - 或者,如果响应很简单,完全跳过 SOAP 膨胀软件,使用纯 HTTP 并自己提取所需的内容。
    • 如果我正确理解了这个问题,类似的破解已经完成,问题不是如何破解,而是如果有一个标准的 cleaner 方法可以使用 WSDL 来完成它。答案是否定的(据我所知)。来自问题:“我确实尝试使用拦截器并用节点包装响应'OK'。但是,想知道是否有更清洁的方法......”
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签