web-dev-qa-db-fra.com

Comment générer un SOAP message avec une requête complète de WSDL sans code gen

Je voudrais vous demander comment je peux générer une demande/réponse SOAP au format XML à partir du fichier WSDL. La plate-forme cible est la machine virtuelle Java (JVM). Vous pouvez donc utiliser un large éventail de langages (par exemple, Java, Scala, Groovy, JRuby, Jython, etc.). La génération demande/réponse SOAP doit être effectuée uniquement au niveau XML, sans génération ni chargement de classe (WSDL2Java, JAXB ou des approches similaires ne sont pas appropriés dans ce cas). La génération doit être effectuée par programme avec l'utilisation de composants open-source. La technique de génération doit prendre en charge les variantes de type document, codage rpc et littéral, afin que le générateur puisse gérer correctement le codage des paramètres. Les messages de demande/réponse doivent être entièrement remplis -> les nœuds vides doivent être générés même pour les valeurs vides/vides.

Couper court en histoire -> Je voudrais faire par programme ce qui est faisable dans SoapUI IDE. J'ai déjà jeté un coup d'œil à différentes bibliothèques/frameworks liés à Java (SAAJ, WSDL4J) ou Ruby (Savon), mais j'ai du mal à le faire évoluer.

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 j'aimerais faire, c'est:

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

Dans ce cas, une demande 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: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
tom.bujok

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

18
tom.bujok

Qu'en est-il de la bibliothèque 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

Vous pourriez être intéressé par projet kSOAP qui est utilisé dans le développement mobile. Le didacticiel suivant kSOAP vous indiquera comment sérialiser la demande et la section suivante vous explique 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 considérablement inférieure à celle du poste de travail et du fait que les classes et bibliothèques de proxy sont considérées comme plus lourdes que la création directe du message SOAP

0
momo

Je cherche en fait à faire la même chose. J'utilise l'API javax.wsdl pour extraire des informations du fichier WSDL et j'essaie d'utiliser l'API javax.xml.soap pour créer la demande/réponse SOAP. Ils pourraient valoir la peine de regarder.

0
user1452717

Article IBM

L'article ci-dessus semble aborder la technique que j'essaierais pour votre cas: utiliser la transformation XSLT. Après tout, vous passez de XML à XML. Si vous avez plus de chance que moi de trouver (ou de développer bien sûr) la ou les feuilles de style XSLT spécifiques nécessaires pour passer d'un WSDL à une demande SOAP d'accompagnement, j'aimerais en savoir plus à ce sujet.

A bientôt, Wim

0
Wivani