Java Webservices aufrufen

Shubham Vora 12 Oktober 2023
  1. SOAP-Webdienste
  2. SOAP-Webdienstaufruf von einer Java-Klasse
Java Webservices aufrufen

In diesem Artikel erfahren Sie, wie Sie einen SOAP-Webdienstaufruf von einer Java-Klasse aus durchführen.

SOAP-Webdienste

Das SOAP steht für Simple Object Access Protocol. Über diese XML-basierte Schnittstelle kann auf Webservices zugegriffen werden.

Das W3C empfiehlt SOAP für die Kommunikation zwischen zwei Apps. Das SOAP-Protokoll ist XML-basiert.

Es hat keine Präferenz für eine bestimmte Plattform oder Sprache. Sie können mit anderen Programmiersprachen-Apps kommunizieren, indem Sie SOAP verwenden.

SOAP-Webdienstaufruf von einer Java-Klasse

In einigen Situationen kann es schneller und hilfreicher sein, Java-Klassen anstelle der web service-Bibliothek zu verwenden, um den SOAP-Dienst aufzurufen. Sie können beispielsweise auf Probleme stoßen, wenn Sie eine Webdienst-Bibliothek verwenden, um einen Client-Proxy zu generieren, oder wenn Sie einige kleine, spezialisierte Teile der Antwort wünschen.

Es ist einfach eine SOAP-Anfrage über das HTTP- oder HTTPS-Protokoll aus einem einfachen Stück Java-Code, ohne irgendwelche Java-Bibliotheken zu verwenden.

Dies sind die folgenden Schritte, um SOAP Web service von einer Java-Klasse aufzurufen.

die WSDL

Öffnen Sie zunächst die WSDL-Datei, um einen SOAP-Webservice-Aufruf von einer Java-Klasse aus durchzuführen. Suchen Sie in der Datei WSDL nach den Speicherorten XSD, SOAP Operation und SOAP-Adresse.

Die SOAP-Anfragen und -Antworten haben die Namen getUserDetailsRequest bzw. getUserDetailsResponse. Zusätzlich gibt es den oder die Eingabeparameter der Anfrage.

Hier ist nur ein Argument vorhanden, name, und es ist ein string.

...
<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>
...

XML anfordern

Java-Code ist nicht erforderlich, um die XML-Antwortstruktur zu erstellen, da wir sie vom Server erhalten. Es ist jedoch Java-Code erforderlich, um die Anforderungsstruktur XML zu erstellen, da wir sie als Eingabe an den SOAP-Dienst senden müssen.

<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>

SOAP-Adresse

Suchen Sie die Adresse der SOAP-Adresse, die als Endpunkt-URL des SOAP-Dienstes dient. Wir verbinden uns mit diesem Endpunkt über die API HttpURLConnection von Java.

SOAP-Operation

Dann muss der Operationsname gefunden werden, der als SOAP-Aktion verwendet wird. getUserDetails befindet sich hier.

Erstellen Sie einen SOAP-Client

Wir haben alle Notwendigkeiten ermittelt und sind bereit, die benutzerdefinierte Java-Klasse zu entwickeln.

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);
    }
  }
}

HTTPS-Aufruf

Verwenden Sie die Idee im Codebeispiel unten, um einen SOAP-Webdienst über eine HTTPS-Verbindung aufzurufen. Dieses Beispiel zeigt, wie man einen SOAP-Webdienst aus einem gewöhnlichen Java-Code mit den Methoden GET und POST kontaktiert.

Der folgende Code dient zur Veranschaulichung der Verwendung des HTTPS-Protokolls. Versuchen Sie daher, bei der Entwicklung des Codes für Ihre Anwendung alle Programmierstandards zu berücksichtigen.

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();
  }
}

In diesem Artikel haben wir gelernt, wie man einen SOAP-Webservice-Aufruf von einer Java-Klasse aus durchführt. In diesem Artikel werden verschiedene Schritte besprochen.

Benutzer können den Schritten folgen, um einen SOAP-Webservice-Aufruf aus der Java-Klasse aufzurufen.

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