Saltar al contenido

¿Cómo hacer una llamada al servicio web SOAP desde la clase Java?

Poseemos la mejor solución que hemos encontrado on line. Nuestro deseo es que te sea útil y si quieres compartir algún detalle que nos pueda ayudar a crecer hazlo con libertad.

Solución:

Entiendo que tu problema se reduce a cómo llamar a un servicio web SOAP (JAX-WS) desde Java y obtener su objeto de retorno. En ese caso, tiene dos enfoques posibles:

  1. Genere las clases de Java a través de wsimport y utilícelos; o
  2. Cree un cliente SOAP que:
    1. Serializa los parámetros del servicio en XML;
    2. Llama al método web mediante manipulación HTTP; y
    3. Analice la respuesta XML devuelta en un objeto.

Acerca del primer enfoque (usando wsimport):

Veo que ya tiene las clases de negocios de los servicios (entidades u otras), y es un hecho que el wsimport genera un conjunto completamente nuevo de clases (que de alguna manera son duplicados de las clases que ya tiene).

Sin embargo, me temo que en este escenario solo puedes:

  • Adaptar (editar) el wsimport código generado para usarlo tu clases de negocios (esto es difícil y de alguna manera no vale la pena; tenga en cuenta que cada vez que cambie el WSDL, tendrá que regenerar y readaptar el código); o
  • Ríndete y usa el wsimport clases generadas. (En esta solución, su código comercial podría “usar” las clases generadas como un servicio de otra capa arquitectónica).

Acerca del segundo enfoque (cree su cliente SOAP personalizado):

Para implementar el segundo enfoque, deberá:

  1. Haz la llamada:
    • Utilice el marco SAAJ (SOAP con API de archivos adjuntos para Java) (consulte a continuación, se envía con Java SE 1.6 o superior) para realizar las llamadas; o
    • También puedes hacerlo a través de java.net.HttpUrlconnection (y algo java.io manejo).
  2. Convierta los objetos en XML y viceversa:
    • Utilice un marco OXM (Object to XML Mapping) como JAXB para serializar / deserializar el XML desde / hacia objetos
    • O, si es necesario, cree / analice manualmente el XML (esta puede ser la mejor solución si el objeto recibido es solo un poco diferente del enviado).

Creando un cliente SOAP usando classic java.net.HttpUrlConnection no es tan difícil (pero tampoco tan simple), y puedes encontrar en este enlace un muy buen código de inicio.

Te recomiendo que uses el marco SAAJ:

SOAP con API de archivos adjuntos para Java (SAAJ) se utiliza principalmente para tratar directamente con los mensajes de solicitud / respuesta SOAP que ocurren detrás de escena en cualquier API de servicio web. Permite a los desarrolladores enviar y recibir mensajes de jabón directamente en lugar de utilizar JAX-WS.

Vea a continuación un ejemplo funcional (¡ejecútelo!) De una llamada de servicio web SOAP utilizando SAAJ. Llama a este servicio 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:
             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.
         */
        String soapEndpointUrl = "https://www.w3schools.com/xml/tempconvert.asmx";
        String soapAction = "https://www.w3schools.com/xml/CelsiusToFahrenheit";

        callSoapWebService(soapEndpointUrl, soapAction);
    

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

        String myNamespace = "myNamespace";
        String 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(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;
    


Acerca del uso de JAXB para serializar / deserializar, es muy fácil encontrar información al respecto. Puede comenzar aquí: http://www.mkyong.com/java/jaxb-hello-world-example/.

O simplemente use wsdl2java de Apache CXF para generar objetos que pueda usar.

Está incluido en el paquete binario que puede descargar desde su sitio web. Simplemente puede ejecutar un comando como este:

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

Utiliza el wsdl para generar objetos, que puede usar así (los nombres de los objetos también se toman del wsdl, por lo que el suyo será un poco diferente):

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

Incluso hay un complemento de Maven que genera las fuentes: https://cxf.apache.org/docs/maven-cxf-codegen-plugin-wsdl-to-java.html

Nota: Si genera fuentes utilizando CXF e IDEA, es posible que desee ver esto: https://stackoverflow.com/a/46812593/840315

Comentarios y valoraciones

Más adelante puedes encontrar las anotaciones de otros administradores, tú de igual forma puedes insertar el tuyo si te apetece.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *