web-dev-qa-db-fra.com

SOAP demande au service Web avec java

Je suis un peu confus sur la manière de faire une demande à un service Web via Java.

Pour l'instant, la seule chose que j'ai comprise est que webservices utilise des messages structurés au format xml, mais je n'ai toujours pas compris comment structurer ma demande.

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <getProductDetails xmlns="http://magazzino.example.com/ws">
      <productId>827635</productId>
    </getProductDetails>
  </soap:Body>
</soap:Envelope>

En gros, je dois envoyer 2 paramètres au service Web et, en retour, deux autres paramètres sont attendus.

J'imagine que certains bocaux peuvent faire l'essentiel du travail, mais je n'en ai trouvé aucun en ligne ... Quelqu'un peut-il m'expliquer s'il vous plaît? 

29
Pievis

Une demande SOAP est un fichier XML contenant les paramètres que vous envoyez au serveur.

La réponse SOAP est également un fichier XML, mais avec tout ce que le service veut vous fournir.

Fondamentalement, le WSDL est un fichier XML qui explique la structure de ces deux XML.


Pour implémenter des clients SOAP simples en Java, vous pouvez utiliser le framework SAAJ (fourni avec JSE 1.6 et versions ultérieures):

SOAP avec API de pièces jointes pour Java (SAAJ) est principalement utilisé pour traiter directement les messages de demande/réponse SOAP qui se produisent dans les coulisses de toute API de service Web. Il permet aux développeurs d’envoyer et de recevoir directement des messages soap au lieu d’utiliser JAX-WS.

Voir ci-dessous un exemple de travail (lancez-le!) D'un appel de service Web SOAP à l'aide de SAAJ. Il appelle ce service Web .

import javax.xml.soap.*;

public class SOAPClientSAAJ {

    // SAAJ - SOAP Client Testing
    public static void main(String args[]) {
        /*
            The example below requests from the Web Service at:
             http://www.webservicex.net/uszip.asmx?op=GetInfoByCity


            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.
         */
        String soapEndpointUrl = "http://www.webservicex.net/uszip.asmx";
        String soapAction = "http://www.webserviceX.NET/GetInfoByCity";

        callSoapWebService(soapEndpointUrl, soapAction);
    }

    private static void createSoapEnvelope(SOAPMessage soapMessage) throws SOAPException {
        SOAPPart soapPart = soapMessage.getSOAPPart();

        String myNamespace = "myNamespace";
        String myNamespaceURI = "http://www.webserviceX.NET";

        // SOAP Envelope
        SOAPEnvelope envelope = soapPart.getEnvelope();
        envelope.addNamespaceDeclaration(myNamespace, myNamespaceURI);

            /*
            Constructed SOAP Request Message:
            <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:myNamespace="http://www.webserviceX.NET">
                <SOAP-ENV:Header/>
                <SOAP-ENV:Body>
                    <myNamespace:GetInfoByCity>
                        <myNamespace:USCity>New York</myNamespace:USCity>
                    </myNamespace:GetInfoByCity>
                </SOAP-ENV:Body>
            </SOAP-ENV:Envelope>
            */

        // SOAP Body
        SOAPBody soapBody = envelope.getBody();
        SOAPElement soapBodyElem = soapBody.addChildElement("GetInfoByCity", myNamespace);
        SOAPElement soapBodyElem1 = soapBodyElem.addChildElement("USCity", myNamespace);
        soapBodyElem1.addTextNode("New York");
    }

    private static void callSoapWebService(String soapEndpointUrl, String 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(String 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;
    }

}
73
acdcjunior

Lorsque le WSDL est disponible, il ne vous reste que deux étapes à suivre pour appeler ce service Web.

Étape 1: Générez la source côté client à partir d'un outil WSDL2Java 

Étape 2: appelez l'opération à l'aide de:

YourService service = new YourServiceLocator();
Stub stub = service.getYourStub();
stub.operation();

Si vous regardez plus loin, vous remarquerez que la classe Stub est utilisée pour appeler le service déployé sur l'emplacement distant en tant que service Web. En appelant cela, votre client génère la demande SOAP et communique. De même, le service Web envoie la réponse sous forme de SOAP. À l'aide d'un outil tel que Wireshark, vous pouvez afficher les messages SOAP échangés.

Cependant, puisque vous avez demandé plus d'explications sur les bases, je vous recommande de consulter ici et d'écrire un service Web avec son client pour l'apprendre davantage.

7
lkamal