java - 如何在没有代码生成的情况下使用来自 WSDL 的完全填充的请求生成 SOAP 消息

标签 java web-services soap wsdl

我想问您如何在 WSDL 文件的基础上生成 XML 格式的 SOAP 请求/响应。目标平台是 JVM,因此可以使用多种语言(例如 Java、Scala、Groovy、JRuby、Jython 等)。 SOAP 请求/响应生成应该纯粹在 XML 级别上完成,而不需要任何类生成和类加载(WSDL2Java、JAXB 或类似方法在这种情况下是不合适的)。生成应该使用开源组件以编程方式完成。生成技术应该支持 document-literal、rpc-encoded 和 rpc-literal 风格,因此正确的参数编码应该由生成器处理。请求/响应消息应该是完全填充的 -> 即使是空/空值也应该生成空节点。

长话短说 -> 我想以编程方式做在 SoapUI IDE 中可行的事情。我已经看过不同的与 Java 相关的库/框架(SAAJ、WSDL4J)或 Ruby(Savon),但我正在努力进一步插入它。

我正在处理的示例 Web 服务定义(WSDL 和 XSD)是 stockquote-ws.wsdlstockquote-schema.xsd

我想做的是:

SoapMessageGenerator generator = new SoapMessageGenerator("stockquote-ws.wsdl");
String request = generator.generateSoapRequest();
String response = generator.generateSoapResponse();

在这种情况下,请求应如下所示:

<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:stoc="http://centeractive.com/stockquote.wsdl" xmlns:stoc1="http://centeractive.com/stockquote.xsd">
   <soapenv:Header/>
   <soapenv:Body>
      <stoc:GetLastTradePrice soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
         <stoc1:TradePriceRequest>
            <tickerSymbol xsi:type="xsd:string">?</tickerSymbol>
         </stoc1:TradePriceRequest>
      </stoc:GetLastTradePrice>
   </soapenv:Body>
</soapenv:Envelope>

...而响应应如下所示:

<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:stoc="http://centeractive.com/stockquote.wsdl" xmlns:stoc1="http://centeractive.com/stockquote.xsd">
   <soapenv:Header/>
   <soapenv:Body>
      <stoc:GetLastTradePriceResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
         <stoc1:TradePrice>
            <price xsi:type="xsd:float">?</price>
         </stoc1:TradePrice>
      </stoc:GetLastTradePriceResponse>
   </soapenv:Body>
</soapenv:Envelope>

最佳答案

好的。我设法完全解决了这个问题。我从soapUI 中提取了一些代码,并启动了一个开源项目,以Java 中纯XML 方式支持SOAP。类提取背后的主要原因是将负责生成 SOAP 消息的代码与与其他模块(例如soapUIs 图形用户界面等)紧密耦合的其余soapUIs 代码分开。您可以找到项目在这里:https://github.com/reficio/soap-ws它不仅能够生成 SOAP 消息,还提供 SOAP 客户端和服务器。更多详情:http://www.reficio.org/projects

关于java - 如何在没有代码生成的情况下使用来自 WSDL 的完全填充的请求生成 SOAP 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7487699/

相关文章:

java - java中的p2p音频 session 和桌面共享

java - 使用 request.getRemoteAddr() 返回 0 :0:0:0:0:0:0:1

java - IllegalStateException : getInputStream() is not available. 这是可重入调用吗?

web-services - 可以(和/或一个好主意)在应用程序之间重用 OAuth token 吗?

有响应时 PHP SoapClient 故障

soap - EWS FindItem CalendarView 对 MaxEntriesReturned 的奇怪处理

java - 如何从 xml 请求中删除 xmlns =""

java - java中如何使用Ghost对象实现延迟加载?

xml - 如何在解码 xml 时忽略命名空间

java - 我可以在 Web 服务中使用 htmlunit 吗?