Java 调用 WebService
本文将教我们如何从 Java 类进行 SOAP WebService 调用。
SOAP 网络服务
SOAP 代表简单对象访问协议。 可以通过这个基于 XML 的接口来访问 Web 服务。
W3C 建议使用 SOAP 在两个应用程序之间进行通信。 SOAP 协议是基于XML 的。
它对任何特定平台或语言没有偏好。 您可以使用 SOAP 与其他编程语言应用程序进行通信。
从 Java 类调用 SOAP Web 服务
在某些情况下,使用 Java 类而不是 Web 服务库来调用 SOAP 服务可能更快、更有帮助。 例如,当使用 Web 服务库生成客户端代理时,或者如果您想要响应的一些小的、专门的部分时,您可能会遇到问题。
它只是通过 HTTP 或 HTTPS 协议从一段简单的 Java 代码发出的 SOAP 请求,无需使用任何 Java 库。
以下是从 Java 类调用 SOAP Web 服务的步骤。
WSDL
首先,打开 WSDL 文件以从 Java 类进行 SOAP Web 服务调用。 检查 WSDL 文件中的 XSD、SOAP 操作和 SOAP 地址位置。
SOAP 请求和响应的名称分别为 getUserDetailsRequest 和 getUserDetailsResponse。 此外,还有请求的输入参数。
这里只有一个参数,名称,它是一个字符串。
...
<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
创建响应 XML 结构不需要 Java 代码,因为我们将从服务器获取它。 但是,需要 Java 代码来创建请求 XML 结构,因为我们必须将其作为输入提交到 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>
SOAP 地址
查找 SOAP 地址位置,该位置充当 SOAP 服务的端点 URL。 我们将使用 Java 的 HttpURLConnection API 连接到此端点。
#@## SOAP 操作 然后必须找到将用作 SOAP 操作的操作名称。 getUserDetails 位于此处。
创建 SOAP 客户端
我们已经确定了所有必要条件并准备开发自定义 Java 类。
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 调用
使用下面代码示例中的想法通过 HTTPS 连接调用 SOAP Web 服务。 此示例演示如何使用 GET 和 POST 方法从普通 Java 代码联系 SOAP Web 服务。
下面的代码演示了如何使用HTTPS协议。 因此,在为应用程序开发代码时尝试考虑所有编程标准。
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();
}
}
本文教我们如何从 Java 类进行 SOAP Web 服务调用。 本文讨论了各个步骤。
用户可以按照以下步骤从 Java 类调用 SOAP Web 服务。
相关文章
Java迭代器remove()方法
发布时间:2023/07/17 浏览次数:117 分类:Java
-
Java 开发人员经常需要在迭代时从 ArrayList 中删除元素或对象。在本文中,我们将了解迭代器的remove()方法和集合的remove()方法的工作原理有何不同。
查找 Java 中的内存泄漏
发布时间:2023/07/17 浏览次数:96 分类:Java
-
本文将教我们如何查找Java内存泄漏。未使用的项目占用额外的内存空间称为内存泄漏。 内存泄漏是有问题的,因为它们会堵塞内存资源并随着时间的推移降低系统性能。
Java 8 Stream 中的属性不同
发布时间:2023/07/17 浏览次数:171 分类:Java
-
本文通过属性演示了在 Java 中使用流的独特功能。Java 8 Stream 中的属性不同 Java 8 Stream 有一个 distinct() 方法,可以过滤列表中的重复项。
在 Java 中将 Iterable 转换为 Stream
发布时间:2023/07/17 浏览次数:51 分类:Java
-
在本文中,我们将学习一种将 Iterable 转换为 Stream 的方法。在 Java 中使用 StreamSupport.stream() 方法将 Iterable 转换为 Stream
在 Eclipse 中更改 Java 版本
发布时间:2023/07/17 浏览次数:110 分类:Java
-
用户在处理特定项目时可能需要降级或升级 Java 版本。 在这种情况下,Eclipse IDE 允许我们更改特定项目的 JDK 版本。本文介绍了在 Eclipse IDE 中更改 Java 版本的分步指南。在 Eclipse 中下载并添加
在 Java 中使用 Fiddler 捕获 HTTPS 流量
发布时间:2023/07/17 浏览次数:59 分类:Java
-
Fiddler是一个Web调试代理工具,可以帮助开发人员调试Web应用程序。 它允许捕获网络流量并监控传入和传出的数据。本文将教我们设置Fiddler来捕获HTTPS流量。
用 Java 构建工具
发布时间:2023/07/17 浏览次数:53 分类:Java
-
本文主要关注Java构建工具。 首先,我们将了解什么是构建工具,然后我们将讨论 5 个最流行的 Java 工具。什么是构建工具 无论开发人员使用哪种编程语言来开发软件,构建工具在自动化构建过
Java 中的警报弹出窗口
发布时间:2023/07/17 浏览次数:149 分类:Java
-
Swing 库用 Java 显示警报弹出窗口。 本教程演示如何用 Java 创建警报消息。Java 中的警报弹出窗口 如上所述,Swing 库用 Java 创建警报弹出窗口。
Java 中的背景颜色
发布时间:2023/07/17 浏览次数:108 分类:Java
-
本文介绍如何在 Java 中更改背景颜色。Java 中的背景颜色 在 Java GUI 中更改背景颜色是一个简单的操作。 setBackground() 方法用于设置和更改 Java 中 JFrame 的背景颜色。