web-dev-qa-db-ja.com

コード生成なしでWSDLから完全に移入されたリクエストでSOAPメッセージを生成する方法

WSDLファイルに基づいてXML形式でSOAPリクエスト/レスポンスを生成する方法を教えてください。ターゲットプラットフォームはJVMであるため、さまざまな言語を使用できます(たとえば、Java、Scala、Groovy、JRuby、Jythonなど)。SOAPリクエスト/レスポンスの生成は、クラス生成およびクラスローディング(WSDL2Javaこの場合、JAXBまたは同様のアプローチは不適切です。生成は、オープンソースコンポーネントを使用してプログラムで実行する必要があります。要求/応答メッセージは完全に入力されている必要があります->空/空の値に対しても空のノードが生成されます。

長い話を短くする-> SoapUI IDEで実行可能なことをプログラムで行いたい。さまざまなJava関連のライブラリ/フレームワーク(SAAJ、WSDL4J)またはRuby(Savon)を既に見てきましたが、これ以上移動するのに苦労しています。

私が取り組んでいるサンプルのWebサービス定義(WSDLおよびXSD)はstockquote-ws.wsdlおよびstockquote-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>
20
tom.bujok

OK。私はこの問題を完全に解決することができました。私はsoapUIからいくつかのコードを抽出し、Javaで純粋なXMLの方法でSOAPをサポートするオープンソースプロジェクトを開始しました。クラス抽出の背後にある主な理由は、 soapUIsグラフィカルユーザーインターフェイスなど、他のモジュールと緊密に結合された残りのsoapUIsコードからのSOAPメッセージの生成。プロジェクトはここにあります: https://github.com/reficio/soap-ws SOAPメッセージを生成できるだけでなく、SOAPクライアントとサーバー詳細はこちら: http://www.reficio.org/projects

18
tom.bujok

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));
        }
    }
}
6
sonnykwe

モバイル開発で使用される kSOAPプロジェクト に興味があるかもしれません。 kSOAPチュートリアルに続く は、要求をシリアル化する方法を示し、次のセクションでは応答を取得する方法を示します。

kSOAPは、プロキシコードを生成することなくSOAPメッセージを作成できます。これは、デスクトップよりも処理能力がかなり低く、プロキシクラスとライブラリが重いと見なされるため、モバイル開発に必要です。 SOAPメッセージを直接作成するよりも

0
momo

私は実際に同じことをしたいと考えています。 javax.wsdl APIを使用してwsdlから情報を取得し、javax.xml.soap APIを使用してSOAP要求/応答を作成しようとしています。見てみましょう。

0
user1452717

IBM記事

上記の記事は、XSLT変換を利用するという、私があなたの場合に試みるテクニックに対処しているようです。結局のところ、XMLからXMLに移行します。あなたがWSDLから付随するSOAPリクエスト)に行く必要がある特定のXSLTスタイルシートを見つける(またはもちろん開発する)よりも幸運があればそれについて学ぶ。

乾杯、ウィム

0
Wivani