Comment faire un appel de service Web SOAP à partir de la classe Java?

Je suis relativement nouveau dans le monde des webservices et mes recherches semblent m’avoir plus compliqué que de m’éclairer. Mon problème est que l’on m’a donné une bibliothèque (jar) que je devais étendre avec certaines fonctionnalités de webservice.

Cette bibliothèque sera partagée avec les autres développeurs, et parmi les classes du fichier jar figureront des classes ayant une méthode qui appelle un service Web (qui définit essentiellement un atsortingbut de la classe, une logique métier, comme le stockage de l’object dans une firebase database, etc et renvoie l’object avec ces modifications). Je veux rendre l’appel à ce service aussi simple que possible, si possible aussi simple que nécessaire pour le développeur utilisant la classe.

Car c = new Car("Blue"); c.webmethod(); 

J’ai étudié JAX-WS pour l’utiliser sur le serveur mais il me semble que je n’ai pas besoin de créer un wsimport dans le serveur ni le wsimport sur le client, car je sais que les deux ont les classes, j’ai juste besoin d’interaction entre les classes partagées à la fois sur le serveur et sur le client. Selon vous, comment faire le webservice et l’appel dans la classe?

Je comprends que votre problème se résume à comment appeler un service Web SOAP (JAX-WS) à partir de Java et obtenir son object de retour . Dans ce cas, vous avez deux approches possibles:

  1. Générez les classes Java via wsimport et utilisez-les; ou
  2. Créez un client SOAP qui:
    1. Sérialise les parameters du service en XML;
    2. Appelle la méthode Web via la manipulation HTTP; et
    3. Analyser la réponse XML renvoyée dans un object.

A propos de la première approche (en utilisant wsimport ):

Je vois que vous avez déjà les classes métier des services (entités ou autres), et que wsimport génère un nouvel ensemble de classes (qui sont en quelque sorte des doublons des classes que vous avez déjà).

J’ai bien peur que, dans ce scénario, vous ne pouvez que:

  • Adaptez (modifiez) le code généré par wsimport pour qu’il utilise vos classes professionnelles (ceci est difficile et ne vaut pas la peine, gardez à l’esprit que chaque fois que le WSDL change, vous devrez régénérer et réadapter le code); ou
  • Abandonnez et utilisez les classes générées par wsimport . (Dans cette solution, votre code métier peut “utiliser” les classes générées en tant que service provenant d’une autre couche architecturale.)

A propos de la seconde approche (créez votre client SOAP personnalisé):

Pour mettre en œuvre la deuxième approche, vous devrez:

  1. Faire l’appel:
    • Utilisez le framework SAAJ (API SOAP avec pièces jointes pour Java) (voir ci-dessous, fourni avec Java SE 1.6 ou supérieur) pour effectuer les appels; ou
    • Vous pouvez également le faire via java.net.HttpUrlconnection (et quelques manipulations java.io ).
  2. Transformez les objects à partir de XML:
    • Utiliser un framework OXM (Object to XML Mapping) tel que JAXB pour sérialiser / désérialiser le XML depuis / dans les objects
    • Ou, si vous le devez, créez / parsingz manuellement le XML (cela peut être la meilleure solution si l’object reçu n’est que légèrement différent de celui envoyé).

Créer un client SOAP en utilisant java.net.HttpUrlConnection classique n’est pas si difficile (mais pas si simple que cela), et vous pouvez trouver dans ce lien un très bon code de départ.

Je vous recommande d’utiliser le framework SAAJ:

L’API SOAP with Attachments pour Java (SAAJ) est principalement utilisée pour traiter directement les messages de demande / réponse SOAP qui se produisent en coulisse dans n’importe quelle API de service Web. Il permet aux développeurs d’envoyer et de recevoir directement des messages de type soap au lieu d’utiliser JAX-WS.

Voir ci-dessous un exemple de fonctionnement (lancez-le!) D’un appel de service Web SOAP utilisant SAAJ. Il appelle ce service Web .

 import javax.xml.soap.*; public class SOAPClientSAAJ { // SAAJ - SOAP Client Testing public static void main(Ssortingng args[]) { /* The example below requests from the Web Service at: https://www.w3schools.com/xml/tempconvert.asmx?op=CelsiusToFahrenheit To call other WS, change the parameters below, which are: - the SOAP Endpoint URL (that is, where the service is responding from) - the SOAP Action Also change the contents of the method createSoapEnvelope() in this class. It constructs the inner part of the SOAP envelope that is actually sent. */ Ssortingng soapEndpointUrl = "https://www.w3schools.com/xml/tempconvert.asmx"; Ssortingng soapAction = "https://www.w3schools.com/xml/CelsiusToFahrenheit"; callSoapWebService(soapEndpointUrl, soapAction); } private static void createSoapEnvelope(SOAPMessage soapMessage) throws SOAPException { SOAPPart soapPart = soapMessage.getSOAPPart(); Ssortingng myNamespace = "myNamespace"; Ssortingng myNamespaceURI = "https://www.w3schools.com/xml/"; // SOAP Envelope SOAPEnvelope envelope = soapPart.getEnvelope(); envelope.addNamespaceDeclaration(myNamespace, myNamespaceURI); /* Constructed SOAP Request Message:     100    */ // SOAP Body SOAPBody soapBody = envelope.getBody(); SOAPElement soapBodyElem = soapBody.addChildElement("CelsiusToFahrenheit", myNamespace); SOAPElement soapBodyElem1 = soapBodyElem.addChildElement("Celsius", myNamespace); soapBodyElem1.addTextNode("100"); } private static void callSoapWebService(Ssortingng soapEndpointUrl, Ssortingng soapAction) { try { // Create SOAP Connection SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance(); SOAPConnection soapConnection = soapConnectionFactory.createConnection(); // Send SOAP Message to SOAP Server SOAPMessage soapResponse = soapConnection.call(createSOAPRequest(soapAction), soapEndpointUrl); // Print the SOAP Response System.out.println("Response SOAP Message:"); soapResponse.writeTo(System.out); System.out.println(); soapConnection.close(); } catch (Exception e) { System.err.println("\nError occurred while sending SOAP Request to Server!\nMake sure you have the correct endpoint URL and SOAPAction!\n"); e.printStackTrace(); } } private static SOAPMessage createSOAPRequest(Ssortingng soapAction) throws Exception { MessageFactory messageFactory = MessageFactory.newInstance(); SOAPMessage soapMessage = messageFactory.createMessage(); createSoapEnvelope(soapMessage); MimeHeaders headers = soapMessage.getMimeHeaders(); headers.addHeader("SOAPAction", soapAction); soapMessage.saveChanges(); /* Print the request message, just for debugging purposes */ System.out.println("Request SOAP Message:"); soapMessage.writeTo(System.out); System.out.println("\n"); return soapMessage; } } 

A propos de l’utilisation de JAXB pour la sérialisation / désérialisation, il est très facile de trouver des informations à ce sujet. Vous pouvez commencer ici: http://www.mkyong.com/java/jaxb-hello-world-example/ .

Ou utilisez simplement wsdl2java d’Apache CXF pour générer des objects que vous pouvez utiliser.

Il est inclus dans le package binary que vous pouvez télécharger sur leur site Web. Vous pouvez simplement exécuter une commande comme celle-ci:

 $ ./wsdl2java -p com.mynamespace.for.the.api.objects -autoNameResolution http://www.someurl.com/DefaultWebService?wsdl 

Il utilise le wsdl pour générer des objects, que vous pouvez utiliser comme ceci (les noms d’object sont également extraits du fichier wsdl, donc le vôtre sera un peu différent):

 DefaultWebService defaultWebService = new DefaultWebService(); Ssortingng res = defaultWebService.getDefaultWebServiceHttpSoap11Endpoint().login("webservice","dadsadasdasd"); System.out.println(res); 

Il existe même un plug-in Maven qui génère les sources: https://cxf.apache.org/docs/maven-cxf-codegen-plugin-wsdl-to-java.html

Remarque: Si vous générez des sources à l’aide de CXF et d’IDEA, vous pouvez consulter cette page: https://stackoverflow.com/a/46812593/840315