Comment générer un message SOAP avec une requête entièrement remplie depuis WSDL sans code gen

je voudrais vous demander comment je peux générer une requête/réponse SOAP dans un format XML sur la base du fichier WSDL. La plate-forme cible est JVM de sorte qu'un large éventail de langues peut être utilisé (par exemple Java, Scala, Groovy, JRuby, Jython, etc.).). La génération de requête/réponse SOAP doit être effectuée purement au niveau XML sans aucune génération de classe et sans chargement de classe (wsdl2java, JAXB ou des approches similaires sont inappropriées dans ce cas). La génération devrait être faite programmatiquement avec l'utilisation de composants open-source. La technique de génération devrait soutenir document-literal, rpc-encoded et rpc-literal flavors, de sorte que le codage approprié des paramètres devrait être manipulé par le générateur. Les messages de requête/réponse doivent être entièrement remplis- > les noeuds vides doivent être générés même pour les valeurs vides / Vierges.

Coupons court à la longue histoire - > je voudrais faire programmatiquement la chose qui est faisable dans SoapUI IDE. J'ai déjà jeté un oeil à différentes bibliothèques/cadres liés à Java (SAAJ, WSDL4J) ou Ruby (Savon) mais j'ai du mal à le déplacer plus loin.

un exemple de définition de service Web (WSDL et XSD) sur lequel je travaille est stockquote-ws.wsdl et stockquote-schema.xsd.

Ce que je voudrais faire c'est:

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

Dans ce cas, une demande doit ressembler à ceci:

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

... alors qu'une réponse devrait ressembler à ceci:

<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
demandé sur Cœur 2011-09-20 19:27:09

5 réponses

OK. J'ai réussi à résoudre entièrement ce problème. J'ai extrait du code de soapUI et j'ai démarré un projet open-source pour supporter SOAP d'une manière purement XML en Java. La principale raison derrière l'extraction de classe était de séparer le code qui est responsable de la génération des messages SOAP du reste du code soapUIs qui est étroitement couplé avec d'autres modules, tels que l'interface utilisateur graphique soapUIs, etc. Vous pouvez trouver le projet ici: https://github.com/reficio/soap-ws non seulement est-il capable de générer des messages SOAP, mais fournit également le client et le serveur SOAP. Plus de détails ici: http://www.reficio.org/projects

17
répondu tom.bujok 2014-06-20 19:18:27

Qu'en est-il de la SOAPUI bibliothèque:

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
répondu sonnykwe 2012-03-01 16:54:43

Vous pourriez être intéressé par projet kSOAP qui est utilisé dans le développement mobile. suivant le tutoriel kSOAP vous indiquera comment sérialiser la demande et la section suivante vous montrer comment obtenir la réponse.

kSOAP pourrait créer le message SOAP sans avoir à générer le code proxy. Cela est nécessaire dans le développement mobile en raison de sa puissance de traitement qui est considérablement moins que le bureau et ayant des classes de proxy et la bibliothèque sont considérés comme plus lourds que de créer directement le message SOAP

0
répondu momo 2011-09-20 16:39:23

IBM article

l'article ci-dessus semble aborder la technique que j'essaierais pour votre cas: utiliser la transformation XSLT. Après tout, vous allez de XML à XML. Si vous avez plus de chance que moi de trouver (ou de développer, bien sûr) la feuille de style XSLT spécifique(s) que vous devez aller d'une demande WSDL à soap accompagnant(s) j'aimerais en savoir plus.

Cheers, Wim

0
répondu Wivani 2011-09-21 10:17:32

je cherche en fait à faire la même chose. J'ai été en utilisant le javax.API wsdl pour extraire des informations de la wsdl et j'essaie d'utiliser javax.XML.API soap pour créer la requête/réponse SOAP. Ils pourraient être la peine de prendre un coup d'oeil.

0
répondu user1452717 2012-06-13 15:19:50