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.