Servicios web de llamadas de Java

Shubham Vora 12 octubre 2023
  1. Servicios web SOAP
  2. Llamada de servicio web SOAP desde una clase Java
Servicios web de llamadas de Java

Este artículo nos enseñará cómo hacer una llamada de servicio web SOAP desde una clase de Java.

Servicios web SOAP

El SOAP significa Protocolo simple de acceso a objetos. Se puede acceder a los servicios web a través de esta interfaz basada en XML.

El W3C recomienda SOAP para la comunicación entre dos aplicaciones. El protocolo SOAP está basado en XML.

No tiene preferencia por ninguna plataforma o idioma en particular. Puede comunicarse con otras aplicaciones de lenguaje de programación utilizando SOAP.

Llamada de servicio web SOAP desde una clase Java

En algunas situaciones, puede ser más rápido y más útil utilizar clases de Java en lugar de la biblioteca de servicios web para invocar el servicio SOAP. Por ejemplo, puede tener problemas al usar una biblioteca de servicio web para generar un proxy de cliente o si desea algunas porciones pequeñas y especializadas de la respuesta.

Es simplemente una solicitud SOAP a través del protocolo HTTP o HTTPS desde una simple pieza de código Java sin utilizar ninguna biblioteca Java.

Estos son los siguientes pasos para llamar al Servicio Web SOAP desde una clase Java.

el WSDL

Primero, abra el archivo WSDL para realizar una llamada de servicio web SOAP desde una clase Java. Compruebe las ubicaciones XSD, Operación SOAP y Dirección SOAP en el archivo WSDL.

Las solicitudes y respuestas SOAP tienen los nombres getUserDetailsRequest y getUserDetailsResponse, respectivamente. Además, están los parámetros de entrada de la solicitud.

Aquí solo está presente un argumento, nombre, y es una cadena.

...
<xs:element name="getUserDetailsRequest">
	<xs:complexType>
		<xs:sequence>
			<xs:element name="name" type="xs:string" />
		</xs:sequence>
	</xs:complexType>
</xs:element>
<xs:element name="getUserDetailsResponse">
	<xs:complexType>
		<xs:sequence>
			<xs:element name="users" type="tns:user" minOccurs="0"
				maxOccurs="unbounded" />
		</xs:sequence>
	</xs:complexType>
</xs:element>
...

Solicitud XML

No se requiere código Java para crear la estructura XML de respuesta, ya que la obtendremos del servidor. Sin embargo, se requiere código Java para crear la estructura XML de la solicitud porque debemos enviarla como entrada al servicio SOAP.

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header/>
<soapenv:Body>
	<getUserDetailsRequest xmlns="https://roytuts.com/UserService">
		<name>User Name</name>
	</getUserDetailsRequest>
</soapenv:Body>
</soapenv:Envelope>

Dirección SOAP

Encuentre la ubicación de la dirección SOAP, que sirve como URL de punto final del servicio SOAP. Nos conectaremos a este punto final usando la API HttpURLConnection de Java.

Operación SOAP

Luego se debe ubicar el nombre de la operación, que se utilizará como acción SOAP. getUserDetails se encuentra aquí.

Crear cliente SOAP

Hemos determinado todas las necesidades y estamos preparados para desarrollar la clase Java personalizada.

package com.roytuts.soap.client;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.StringReader;
import java.io.StringWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.Charset;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
public class SoapClient {
  public static void main(String[] args) throws IOException {
    // Webservice HTTP request configurations
    String wsEndPoint = "http://localhost:9999/ws";
    URL url = new URL(wsEndPoint);
    URLConnection connection = url.openConnection();
    HttpURLConnection http = (HttpURLConnection) connection;
    ByteArrayOutputStream bout = new ByteArrayOutputStream();

    String xmlInput = "<soapenv:Envelope xmlns:soapenv=" http
        : // schemas.xmlsoap.org/soap/envelope/"><soapenv:Header/><soapenv:Body><getUserDetailsRequest
          // xmlns="https://roytuts.com/UserService"><name>User
          // Name</name></getUserDetailsRequest></soapenv:Body></soapenv:Envelope>";
          byte[] buffer = new byte[xmlInput.length()];
    buffer = xmlInput.getBytes();
    bout.write(buffer);
    byte[] b = bout.toByteArray();

    String stringResponse = "";
    String stringOutput = "";
    String SOAPAction = "getUserDetails";

    http.setRequestProperty("Content-Length", String.valueOf(b.length));
    http.setRequestProperty("Content-Type", "text/xml; charset=utf-8");
    http.setRequestProperty("SOAPAction", SOAPAction);
    http.setRequestMethod("POST");
    http.setDoOutput(true);
    http.setDoInput(true);

    OutputStream out = http.getOutputStream();

    out.write(b);
    out.close();

    InputStreamReader isr = new InputStreamReader(http.getInputStream(), Charset.forName("UTF-8"));
    BufferedReader in = new BufferedReader(isr);

    while ((stringResponse = in.readLine()) != null) {
      stringOutput = stringOutput + stringResponse;
    }

    String formattedSOAPResponse = formatXML(stringOutput);
    System.out.println(formattedSOAPResponse);
  }

  private static String formatXML(String unformattedXml) {
    try {
      Document document = parseXmlFile(unformattedXml);
      TransformerFactory transformerFactory = TransformerFactory.newInstance();
      transformerFactory.setAttribute("indent-number", 3);
      Transformer transformer = transformerFactory.newTransformer();
      transformer.setOutputProperty(OutputKeys.INDENT, "yes");
      DOMSource source = new DOMSource(document);
      StreamResult xmlOutput = new StreamResult(new StringWriter());
      transformer.transform(source, xmlOutput);
      return xmlOutput.getWriter().toString();
    } catch (TransformerException e) {
      throw new RuntimeException(e);
    }
  }

  private static Document parseXmlFile(String in) {
    try {
      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
      DocumentBuilder db = dbf.newDocumentBuilder();
      InputSource is = new InputSource(new StringReader(in));
      return db.parse(is);
    } catch (IOException | ParserConfigurationException | SAXException e) {
      throw new RuntimeException(e);
    }
  }
}

Llamada HTTPS

Utilice la idea del ejemplo de código siguiente para llamar a un servicio web SOAP a través de una conexión HTTPS. Este ejemplo demuestra cómo contactar un servicio web SOAP desde un código Java común utilizando los métodos GET y POST.

El siguiente código sirve como ilustración de cómo usar el protocolo HTTPS. Por lo tanto, intente considerar todos los estándares de programación mientras desarrolla el código para su aplicación.

package com.roytuts.java.soap.https.connection;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import javax.net.ssl.HttpsURLConnection;

public class JavaSoapHttpsClient {
  public static void main(String[] args) throws Exception {
    invokeSoapService(
        "https://postman-echo.com/post", "POST", "<xml><body>SAOP request</body></xml>");

    invokeSoapService("https://www.google.com", "GET", null);
  }

  public static void invokeSoapService(
      final String url, final String httpMethod, final String requestXML) throws IOException {
    URL myUrl = new URL(url);

    HttpURLConnection http = (HttpsURLConnection) myUrl.openConnection();
    http.setDoOutput(true);
    http.setRequestMethod(httpMethod);

    OutputStreamWriter out = null;
    if ("POST".equals(httpMethod) && requestXML != null) {
      out = new OutputStreamWriter(conn.getOutputStream());
      out.append(requestXML);
    }

    BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));

    String inputLine;

    System.out.println("Response Code: " + conn.getResponseCode());
    System.out.print("Response Text: ");

    while ((inputLine = br.readLine()) != null) {
      System.out.println(inputLine);
    }

    if (out != null) {
      out.flush();
      out.close();
    }

    br.close();
  }
}

Este artículo nos enseñó cómo hacer una llamada de servicio web SOAP desde una clase de Java. Varios pasos se discuten en este artículo.

Los usuarios pueden seguir los pasos para realizar una llamada de servicio web SOAP desde la clase Java.

Shubham Vora avatar Shubham Vora avatar

Shubham is a software developer interested in learning and writing about various technologies. He loves to help people by sharing vast knowledge about modern technologies via different platforms such as the DelftStack.com website.

LinkedIn GitHub