Bonjour à tous,
Avant toute chose, je tiens à m'excuser par avance pour ce que certains qualifieront sans doute de troll (même si le problème que je pose me semble bien réel et concret).
___
En Javascript, lorsque je souhaite appeler un web service, je fais un appel Ajax du genre ceci :
C'est un exemple se basant sur Jquery mais je pourrais très bien en faire un avec un autre framework, ça serait tout aussi simple.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 $.ajax({ url: "url de mon web service", data: { param1: valeur1, param2: valeur2, param3: valeur3 }), success: function(data) { }, type: "post" });
Maintenant, en Java, lorsque je souhaite appeler un web service, je dois commencer par écrire un nombre incalculable de classes dans un charabia incompréhensible (on a des stubs, des services, des noms qualifiés, des descripteurs d'opérations, des descripteurs de paramètres, des méthodes de sérialisation et de désérialisation, … et j'en passe). Toutes ces notions parlent peut-être aux connaisseurs mais pour des développeurs dont le simple objectif est d'appeler un web service, je ne comprends pas pourquoi une telle complexité (cf le paragraphe précédent sur comment appeler un web service en Javascript). Alors certes, il existe des utilitaires du genre wsdl2java qui permettent de générer tout ce contenu sauf que cela ne m'intéresse absolument pas principalement pour les deux raisons suivantes :
- Le code généré est juste dégu***asse (excusez-moi du terme),
- C'est statique.
C'est ce second point qui me bloque complètement car dans mon cas bien particulier, je dois faire appel à différentes versions d'un même web service de manière dynamique (suivant le cas dans lequel je me trouve, je dois appeler telle ou telle version). La version se situant dans l'URL de mon web service, il est impossible de me baser sur des classes auto-générées qui contiennent en dur l'URL de mon web service. Si à l'avenir une nouvelle version du web service que j'appelle faisait son apparition, je ne veux pas avoir à tout regénérer à la main pour gérer cette n-ième version.
À court terme, je cherche donc désespérément une manière simple et efficace d'appeler un web service en Java. Je souhaite m'affranchir de toutes ces notions bizarroïdes qu'on retrouve dans le code auto-généré par wsdl2java et me retrouver avec au final quelque chose de simple, un peu comme ce qu'on peut retrouver en Javascript : une URL, des paramètres et une instruction pour appeler le tout. Je m'en suis déjà un peu approché avec la méthode générique suivante :
Ce code fonctionne d'ailleurs pour un web service avec des paramètres simples mais voilà, dès que je me retrouve avec des paramètres de type complexe, je suis de nouveau bloqué (je n'ai plus exactement une simple liste de paramètres mais des paramètres contenant eux-mêmes des paramètres). Savez-vous comment à partir de ce que j'ai déjà développé je peux prendre en compte des paramètres de type complexe et de manière simple ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 public Object invoke(String methodName, QName returnType, List<WebServiceParameter> parameters, String soapActionURI) throws ServiceException, MalformedURLException, RemoteException { Service service = new Service(); Call call = (Call) service.createCall(); // Définition des propriétés de l'appel call.setEncodingStyle(null); call.setOperationName(new QName(targetNamespace, methodName)); call.setProperty(Call.SEND_TYPE_ATTR, Boolean.FALSE); call.setReturnType(returnType); call.setSOAPActionURI(soapActionURI); call.setSOAPVersion(SOAPConstants.SOAP11_CONSTANTS); call.setTargetEndpointAddress(new URL(endPoint)); call.setUseSOAPAction(true); // Ajout des paramètres List<Object> methodParameters = new LinkedList<Object>(); for (WebServiceParameter p : parameters) { call.addParameter(new QName(targetNamespace, p.name), p.type, ParameterMode.IN); methodParameters.add(p.value); } // Appel de la méthode et renvoi du résultat return call.invoke(methodParameters.toArray()); }
D'une manière plus générale, au fil de mes multiples recherches sur le net, je suis tombé majoritairement sur les tutos/posts/articles/… suivants :
- comment déployer un web service : 70% des cas mais manque de pot, ce n'est pas ce que je cherche à faire (je remercie au passage les auteurs de tous ces tutos qui sont pour la plupart extrêmement complets et bien expliqués),
- comment auto-générer des classes avec wsdl2java pour consommer un web service : 25% des cas mais là encore, ce n'est pas une solution viable pour moi,
- et les 5% restants qui m'intéressent où j'ai clairement l'impression d'être dans une jungle tant les techniques/bidouilles/… peuvent différer d'un cas à l'autre
Autant il y a maintenant presque 10 ans (si je ne m'abuse), lorsque les web services faisaient tout juste leur apparition dans le monde du Java je pouvais comprendre que ce soit compliqué à mettre en œuvre mais à l'heure actuelle, je ne comprends pas que ce soit toujours aussi complexe. En gros, je cherche à savoir si en Java, il existe enfin une méthode très simple et dynamique pour consommer un web service du genre :
Savez-vous s'il existe quelque chose permettant de faire les choses très simplement en Java ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 WebService monWebService = new WebService(url); List<WebServiceParameter> parametres = new ArrayList<WebServiceParameter>(); parametres.addParam(param1); parametres.addParam(param2); parametres.addParam(param3); Object result = monWebService.invoke(method, parametres);
Encore une fois, les deux questions que je pose restent très ouvertes et je ne sais pas si elles trouveront des réponses. Je vous remercie en tous cas pour votre aide et pour vos conseils sur le sujet.
Partager