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.
