迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > Java >

Java 调用 WebService

作者:迹忆客 最近更新:2023/07/16 浏览次数:

本文将教我们如何从 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 switch 多 case

下一篇:Java条件编译

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

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 的背景颜色。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便