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

2022-09-02 04:15:02

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

长话短说>我想以编程方式做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>

答案 1

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


答案 2

那么库呢:SOAPUI

package com.bbog.soap;

import com.eviware.soapui.impl.wsdl.WsdlInterface;
import com.eviware.soapui.impl.wsdl.WsdlOperation;
import com.eviware.soapui.impl.wsdl.WsdlProject;
import com.eviware.soapui.impl.wsdl.support.wsdl.WsdlImporter;
import com.eviware.soapui.model.iface.Operation;

public class WsdlAnalyzer {

    public static void main(String[] args) throws Exception {
        WsdlProject project = new WsdlProject();
        WsdlInterface[] wsdls = WsdlImporter.importWsdl(project, "http://localhost:7000/Solicitud?wsdl");
        WsdlInterface wsdl = wsdls[0];
        for (Operation operation : wsdl.getOperationList()) {
            WsdlOperation op = (WsdlOperation) operation;
            System.out.println("OP:"+op.getName());
            System.out.println(op.createRequest(true));
            System.out.println("Response:");
            System.out.println(op.createResponse(true));
        }
    }
}

推荐