it-swarm.com.de

So generieren Sie eine SOAP Nachricht mit einer vollständig ausgefüllten Anforderung von WSDL ohne Code-Gen

Ich möchte Sie fragen, wie ich auf Basis der WSDL-Datei eine SOAP -Anforderung/Antwort im XML-Format generieren kann. Die Zielplattform ist JVM, so dass ein breiter Satz von Sprachen verwendet werden kann (z. B. Java, Scala, Groovy, JRuby, Jython usw.). Die SOAP -Anforderung/Antwort-Generierung sollte ausschließlich auf XML-Ebene erfolgen, ohne dass Klassen generiert und geladen werden müssen (WSDL2Java, JAXB oder ähnliche Ansätze sind in diesem Fall ungeeignet). Die Generierung sollte programmgesteuert unter Verwendung von Open-Source-Komponenten erfolgen. Die Generierungstechnik sollte dokumentenliteral, rpc-codiert und rpc-literal unterstützen, sodass die korrekte Codierung der Parameter vom Generator verarbeitet werden sollte. Anforderungs-/Antwortnachrichten sollten vollständig ausgefüllt sein -> leere Knoten sollten auch für leere/leere Werte generiert werden.

Kurz gesagt -> Ich möchte programmgesteuert das tun, was in SoapUI IDE möglich ist. Ich habe mir schon verschiedene Java-bezogene Bibliotheken/Frameworks (SAAJ, WSDL4J) oder Ruby (Savon) angeschaut, aber ich habe Mühe, es weiter zu verschieben.

Eine Beispiel-Web-Service-Definition (WSDL und XSD), an der ich gerade arbeite, ist stockquote-ws.wsdl und stockquote-schema.xsd.

Was ich gerne machen würde ist:

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

In diesem Fall sollte eine Anfrage so aussehen:

<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>

... während eine Antwort so aussehen sollte:

<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>
19
tom.bujok

OK. Ich habe dieses Problem vollständig gelöst. Ich habe etwas von soapUI extrahiert und ein Open-Source-Projekt gestartet, um SOAP in Java rein XML zu unterstützen. Der Hauptgrund für die Klassenextraktion bestand darin, den Code, der für die Erzeugung der SOAP - Nachrichten verantwortlich ist, vom Rest des soapsUIs-Codes zu trennen, der eng mit anderen Modulen verbunden ist, z. B. der grafischen Benutzeroberfläche von soapUIs usw. Sie finden das Projekt hier: https://github.com/reficio/soap-ws Es kann nicht nur SOAP - Meldungen generieren, sondern stellt auch SOAP Client und Server bereit. Weitere Details hier: http://www.reficio.org/projects

18
tom.bujok

Was ist mit der SOAPUI-Bibliothek:

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

Möglicherweise interessieren Sie sich für das kSOAP-Projekt , das in der mobilen Entwicklung verwendet wird. Das im Anschluss an das kSOAP-Tutorial zeigt Ihnen, wie Sie die Anforderung serialisieren, und der folgende Abschnitt zeigt Ihnen, wie Sie die Antwort erhalten. 

kSOAP könnte die SOAP - Nachricht erstellen, ohne den Proxy-Code generieren zu müssen. In der mobilen Entwicklung ist dies aufgrund seiner Verarbeitungsleistung, die erheblich geringer ist als beim Desktop, erforderlich. Proxy-Klassen und -Bibliotheken gelten als schwerer als das direkte Erstellen der SOAP - Nachricht

0
momo

Ich suche eigentlich das Gleiche. Ich habe die javax.wsdl-API verwendet, um Informationen aus dem wsdl abzurufen, und ich versuche, die javax.xml.soap-API zu verwenden, um die SOAP -Anforderung/Antwort zu erstellen. Sie könnten einen Blick wert sein.

0
user1452717

IBM Artikel

Der obige Artikel scheint die Technik zu behandeln, die ich für Ihren Fall versuchen würde: Verwenden Sie die XSLT-Transformation. Schließlich wechseln Sie von XML zu XML. Wenn Sie mehr Glück haben, als ich die spezifischen XSLT-Stylesheets finden (oder entwickeln werde), die Sie benötigen, um von einer WSDL zu begleitenden SOAP -Anfragen zu gelangen, würde ich gerne darüber erfahren.

Prost, Wim

0
Wivani