首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在不生成代码的情况下使用来自WSDL的完全填充的请求生成SOAP消息

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

Stack Overflow用户
提问于 2011-09-20 23:27:10
回答 5查看 61.6K关注 0票数 21

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

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

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

我想做的是:

代码语言:javascript
复制
SoapMessageGenerator generator = new SoapMessageGenerator("stockquote-ws.wsdl");
String request = generator.generateSoapRequest();
String response = generator.generateSoapResponse();

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

代码语言:javascript
复制
<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>

..。而响应应该是这样的:

代码语言:javascript
复制
<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>
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-07-31 23:57:14

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

票数 18
EN

Stack Overflow用户

发布于 2012-03-01 05:54:32

那么SOAPUI库呢:

代码语言:javascript
复制
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));
        }
    }
}
票数 5
EN

Stack Overflow用户

发布于 2011-09-21 00:32:03

您可能会对移动开发中使用的kSOAP project感兴趣。following kSOAP tutorial将指导您如何序列化请求,下面的部分将向您展示如何获取响应。

kSOAP可以在不生成代理代码的情况下创建SOAP消息。这在移动开发中是需要的,因为它的处理能力比台式机低得多,并且具有代理类和库被认为比直接创建SOAP消息更重

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7487699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档