我的编程空间,编程开发者的网络收藏夹
学习永远不晚

JavawebSerivce的使用看完你就明白了

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

JavawebSerivce的使用看完你就明白了

茫茫人海千千万万,感谢这一秒你看到这里。希望我的文章对你的有所帮助!

愿你在未来的日子,保持热爱,奔赴山海!

? 前言

webService与我们常见的httpapi接口有什么区别呢?

  • 不同协议:HTTPService基于http协议,而WebService基于soap协议;
  • 处理数据效率不同:HTTPService效率较高,传输的是字符串,而WebService是包装成了更复杂的对象以致于能处理较复杂的数据类型;
  • 是否可以跨域处理:HttpService方式不能处理跨域,如果调用一个其它应用的服务就要用webService,就像我现在是调其他系统的服务。

? 概述

? 介绍下

WebService主要是通过SOAP协议在Web上提供的软件服务,使用WSDL文档进行说明,并通过UDDI进行注册。WebService是一种跨编程语言和跨操作系统平台的远程调用技术,能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。依据WebService规范实施的应用之间, 无论它们所使用的语言、 平台或内部协议是什么, 都可以相互交换数据。

所以呢,如果你想是使用不同语言,不同平台,不同地方,想进行数据传输,自我推荐下,选择WebService就没错的!

? 多维度了解

  • 从表面看,WebService就是一个应用程序向外界暴露出一个能通过Web进行调用的API,也就是说能用编程的方法通过Web来调用这个应用程序。我们把调用这个WebService的应用程序叫做客户端,而把提供这个WebService的应用程序叫做服务端。
  • 从内层看,WebService不是一种技术,更像是建立在可互操作的分布式应用程序的新平台,是一个平台,是一套标准,是一种规范。它定义了应用程序如何在Web上实现互操作性,你可以用任何你喜欢的语言,在任何你喜欢的平台上写WebService ,只要我们可以通过WebService标准对这些服务进行查询和访问。

?‍?‍? 三个好兄弟

常伴于三个元素兄弟:UDDI,WSDL,SOAP

  • UDDI:UDDI 是一种用于描述、发现、集成Web Service的技术,它是Web Service协议栈的一个重要部分。通过UDDI,企业可以根据自己的需要动态查找并使用Web服务,也可以将自己的Web服务动态地发布到UDDI注册中心,供其他用户使用。UDDI利用SOAP消息机制(标准的XML/HTTP)来发布,编辑,浏览以及查找注册信息。它采用XML格式来封装各种不同类型的数据,并且发送到注册中心或者由注册中心来返回需要的数据。
  • WSDL:是为了描述Web服务发布的XML格式。就是用机器能阅读的方式提供的一个正式描述文档而基于XML(标准通用标记语言下的一个子集)的语言,用于描述WebService及其函数、参数和返回值。因为是基于XML的,所以WSDL既是机器可阅读的,又是人可阅读的。
  • SOAP:简单对象访问协议,是交换数据的一种协议规范,是一种轻量的、简单的、基于XML标准通用标记语言下的一个子集)的协议。主要组成由Http协议和XML数据格式。WebService通过HTTP协议发送请求和接收结果时,发送的请求内容和结果内容都采用XML格式封装,并增加了一些特定的HTTP消息头,以说明HTTP消息的内容格式,这些特定的HTTP消息头和XML内容格式就是SOAP协议。SOAP提供了标准的RPC(远程调用技术)方法来调用WebService。

? 选择的好处

  • 跨平台调用。
  • 跨语言调用。
  • 远程调用。

? 来开始使用吧

话不多说,看太多理论不如自己做个小demo测下来得爽快。所以Let's GO!

做一个天气系统的demo,客户端发送城市名称,服务器端回应相应的天气。

? 创建一个空项目

创建一个空项目weatherServer出来,我使用的IDEA版本为2020.3版本。当然一开始我比较详细介绍啦

?实现发布服务端

1. 创建服务端模块weatherServerTest

创建过程基本类似的。如果你想选择使用我,那么我会提议你先创建一个服务端,这样别人可以进行访问,或者使用他人的服务端都OK的啦。这里先会完成创建出一个服务端模块出来,后续的创建客户端模块基本类似。这里我们直接选择一个Maven项目即可,也可以自行选择一个普通Java项目都行。JDK为流行的JDK8即可。

最终得到的空模块服务端如下:

2. 提供天气服务

接下来就是开发服务端代码。提供简单的城市天气服务。

定义一个天气业务接口IWeatherService

代码如下:


package com.ws.service;

public interface IWeatherSerice {
    
    public String queryWeather(String city);
}

编写对应的接口实现类WeatherServiceImpl

对应的代码如下:


package com.ws.service.impl;

import com.ws.service.IWeatherSerice;
import javax.jws.WebService;

@WebService  // 用该注解修改表示当前类是一个服务类 必须加上的,不然启动服务的时候会报错。
public class WeatherServiceImpl implements IWeatherSerice {

    @Override
    public String queryWeather(String city) {
        // 这里直接返回对应的城市和晴天!!!
        return city + "的天气为:晴天!";
    }
}

创建一个用于发布服务的类WeatherServerDemo。

对应的代码如下:


package com.ws.server;

import com.ws.service.impl.WeatherServiceImpl;
import javax.xml.ws.Endpoint;

public class WeatherServerDemo {

    public static void main(String[] args) {
        
        Endpoint.publish("http://localhost:8086/weatherServer", new WeatherServiceImpl());
        System.out.println("服务发布成功");
    }
}

运行main方法,开启服务:

可以看到控制台,他没有运行完成后关闭,并且显示服务发布成功了。接下来就在线看看我们发布的服务。

3. 访问服务

访问刚才提供的访问的地址加上?wsdl,如:http://localhost:8086/weatherServer?wsdl

那如何看这个wsdl文档呢?不怕,让我来教你看几个重要的部分就一目了然啦!注意:wsdl文档需要从下往上看

  • :服务视图名称,WebService的服务端点
  • :Web Services的通信协议,还描述Web Services的方法、输入、输出。
  • :描述了WebService可执行的操作,通过binding指向portType
  • :描述了服务中发布的方法,包括参数,返回值等。
  • :定义了WebService中使用的数据类型

访问一个详细的参数页面:http://localhost:8086/weatherServer?xsd=1

? 实现客户端访问的几种方式

1. 创建客户端模块weatherClientTest

结构:

2. 生成对应的客户端代码

为什么需要下载客户端代码,首先前面两个方式需要用到服务端代码的接口,然后如果你是访问远程的服务端,那你也就访问不了。

这里会介绍jdk自带的命令:wsimport

wsimport是jdk自带的webservice客户端工具,可以根据wsdl文档生成客户端调用代码(java代码).
wsimport.exe位于JAVA_HOME\bin目录下
常用参数为:
-d<目录> - 将生成.class文件。默认参数。
-s<目录> - 将生成.java文件。
-p<生成的新包名> -将生成的类,放于指定的包下
wsimport -s ./ http://localhost:8086/weatherServer?wsdl

生成步骤:

  • 进入到客户端模块的class="lazy" data-src的java目录下

在该目录中,进入命令行模式,然后输入wsimport -s ./ http://localhost:8086/weatherServer?wsdl,下载刚才启动的服务端代码。注意:这一步得保证服务端是启动可访问状态。

最终生成代码的结构在IDEA结构为:

​ 这里得到的代码跟wsdl文档对应的名称可以一一对应。当然如果你想改包名的话,可以使用-p参数。

3. 客户端访问方式1

第一种方式:通过得到的代码,service方式调用。

结构如下:

代码如下:


package com.ws.client;

import com.ws.service.impl.WeatherServiceImpl;
import com.ws.service.impl.WeatherServiceImplService;

public class WeatherClientDemo1 {
    public static void main(String[] args) {
        // 1. 创建服务视图
        WeatherServiceImplService weatherServiceImplService = new WeatherServiceImplService();

        // 2. 得到服务实现类
        WeatherServiceImpl weatherService = weatherServiceImplService.getPort(WeatherServiceImpl.class);

        // 3. 调用接口的方法
        String result = weatherService.queryWeather("广州");

        // 4. 返回远程访问得到的结果 --> result = 广州的天气为:晴天!
        System.out.println("result = " + result);
    }
}

最终我们运行后得到的结果也正如所预料的一般:

4. 客户端访问方式2

之前这一步有什么缺陷呢,应该很清楚吧:我们固定了一个服务地址了,而且如果要改服务地址的话,可能还需要再生成一遍代码。

所以我们把服务地址写出来,结构如下:

代码如下:


package com.ws.client;

import com.ws.service.impl.WeatherServiceImpl;
import com.ws.service.impl.WeatherServiceImplService;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import java.net.MalformedURLException;
import java.net.URL;

public class WeatherClientDemo2 {
    public static void main(String[] args) throws Exception {
        // 1. 设置访问的服务端地址
        URL url = new URL("http://localhost:8086/weatherServer?wsdl");
        
         
        QName qName = new QName("http://impl.service.ws.com/", "WeatherServiceImplService");
        
        // 3. 生成服务视图
        Service service = Service.create(url, qName);
        
        // 4. 得到服务视图的实现类 --> WeatherServiceImpl
        WeatherServiceImpl weatherServiceImpl = service.getPort(WeatherServiceImpl.class);

        // 5. 调用接口方法得到结果! --> result = 深圳的天气为:晴天!
        String result = weatherServiceImpl.queryWeather("深圳");
        System.out.println("result = " + result);
    }
}

这些对应的参数在wsdl的那个位置呢? 看我指给你:

这第二种方式是比较常用的方式,首先推荐!

5. 客户端访问方式3

在不需要下载服务端代码的,通过HTTPURLConnection的方式进行访问服务端。只是这里代码就相对比较长啦,而且需要自行定义XML字符串和解析字符串。

在pom.xml文件中加入一个dom4j的依赖包


<dependencies>
    <dependency>
        <groupId>org.dom4j</groupId>
        <artifactId>dom4j</artifactId>
        <version>2.1.1</version>
    </dependency>

    <dependency>
        <groupId>jaxen</groupId>
        <artifactId>jaxen</artifactId>
        <version>1.1.1</version>
    </dependency>
</dependencies>

结构如下:

创建对应的测试demo,大概结构如下:

代码如下:可以复制到IDEA仔细观看。


package com.ws.client;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Node;

import java.io.DataOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;

public class WeatherClientDemo3 {
    public static void main(String[] args) throws Exception {
        // 1. 设置访问的服务端地址
        URL url = new URL("http://localhost:8086/weatherServer?wsdl");

        // 2.打开一个通向服务地址的连接
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();

        // 3.设置参数, --> POST必须大写,否则抛出异常
        connection.setRequestMethod("POST");
        // 这里是text/xml不是text/html
        connection.setRequestProperty("content-Type", "text/xml;charset=utf-8");

        // 4.设置输入输出,默认是false没有读写的权限
        connection.setDoOutput(true);
        connection.setDoInput(true);

        // 5.组织SOAP数据,发送请求
        String soapXml = getXmlString("佛山");
        System.out.println("soapXml = " + soapXml);

        // 6. 将数据写入到输出流中
        DataOutputStream dos = new DataOutputStream(connection.getOutputStream());
        dos.write(soapXml.getBytes("utf-8"));
        dos.flush();

        // 7. 判断远程访问是否成功,如果响应码为200即为成功
        if (connection.getResponseCode() == 200) {
            // 8. 获取相应的输入流,得到对应的结果
            InputStream ips = connection.getInputStream();
            Scanner scanner = new Scanner(ips);
            StringBuffer buffer = new StringBuffer();
            while (scanner.hasNextLine()) {
                buffer.append(scanner.nextLine());

            }
            scanner.close();
            // 得到为xml字符串
            System.out.println("buffer = " + buffer);
            // 9. 解析xml字符串获得返回的字符串
            String xml = parseXmlToString(buffer);
            System.out.println("xml = " + xml);

        }
    }

    private static String parseXmlToString(StringBuffer buffer) {
        try {
            // 得到对应的文档对象
            Document document = DocumentHelper.parseText(buffer.toString());
            // "//"从任意位置的节点上选择名称为 item 的节点。
            Node node = document.selectSingleNode("//return");
            return node.getText();

        } catch (DocumentException e) {
            e.printStackTrace();

        }
        return null;
    }

    private static String getXmlString(String string) {
        String xml = "<?xml version=\"1.0\" ?>"
                + "<S:Envelope xmlns:S=\"http://schemas.xmlsoap.org/soap/envelope/\">"
                + "<S:Body>" + "<ns2:queryWeather xmlns:ns2=\"http://impl.service.ws.com/\">"
                + "<arg0>" + string
                + "</arg0>" + "</ns2:queryWeather>" + "</S:Body>"
                + "</S:Envelope>\"";
        return xml;

    }
}

得到的结果:

可以看出,可以得到相对应的结果。

6. 三种方式比较

  • 第一种方法:它虽然代码比较简洁,但是耦合度较高,只能适用于当前下载的服务端的地址。一般我们服务端启动后,接口方法,参数这些都不会发生太大的变化。但是如果地址改变了也就需要重新下载服务端代码。
  • 第二种方式:在第一种方式的基础上,将服务端访问地址抽出来,这样我们就可以在xml文件等配置文件中进行配置对应的服务访问地址,一旦需要修改,只需修改配置文件的访问地址即可。
  • 第三种方式:它并不需要下载服务端代码,通过HTTPURLConnection的方式去远程访问服务端,但是需要自己去生成xml字符串,然后得到的结果也需要自己去解析出来。而一旦传入的xml字符串参数错了,就会响应失败,或者得到的字符串解析失败的问题。
  • 个人推荐第二种方式,下载服务端代码,然后编写访问的服务端的地址和创建对应的接口去调方法。无需编写额外的xml字符串和解析字符串。

?优缺点

?优点

  • 通过我们的客户端第三种方式,就可以得知我是采用XML格式封装数据,并且XML它是跨平台,并且不需要特定的语言编写出来,所以我也是跨平台的。
  • 通过客户端访问的方式,我们可以得知服务端可以在远程,可以在本地,我们可以通过SOAP协议实现异地调用。

?️ 缺点

因为我是采用XML格式封装数据的嘛,所以在传输过程中,可能需要传输额外的标签,然而标签越来越大的话,导致webservice性能下降。

? 使用场景

  • 发布一个服务(对内/对外),不考虑客户端类型,不考虑语言,不考虑性能,建议使用WebService。
  • 服务端已经确定使用WebService,客户端不能选择,就必须使用WebService。

? 不适用场景

  • 在系统考虑性能情况下,不建议使用WebService。
  • 同构程序(一个公司中系统之间的接口)下不建议使用WebService,比如java用RMI(远程方法调用),不需要翻译成XML的数据。

?总结

相信各位看官都对webService如何使用及其它的概念和一些知识点都有了稍稍的了解吧,不确定用到人的是否很多,这里只做入门练习,当然如果我们要整合到SpringBoot项目中,甚至我们可以集成相关依赖来使用webService,例如我们可以使用SpringBoot使用CXF集成WebService。那我们应不应该学习这一门技术呢?其实我觉得看需求,如果需要用到了,我们可以快速了解下,用一用小demo快速入门,接着使用集成CXF来整合到项目中,从而达到这门技术的应用到实际项目中去!

我个人其实也没有接触过,只因项目中需要来调用这样webService接口的需求,所以我也是刚入门,而且现在各网页接口基本都是基于http请求来做的,所以我们可以当了解了解咯,走过路过,瞧一瞧,保证不吃亏呀!!!

让我们也一起加油吧!本人不才,如有什么缺漏、错误的地方,也欢迎各位人才大佬评论中批评指正!当然如果这篇文章确定对你有点小小帮助的话,也请亲切可爱的人才大佬们给个点赞、收藏下吧,一键三连,非常感谢!

学到这里,今天的世界打烊了,晚安!虽然这篇文章完结了,但是我还在,永不完结。我会努力保持写文章。来日方长,何惧车遥马慢!

感谢各位看到这里!愿你韶华不负,青春无悔!

到此这篇关于Java webSerivce的使用看完你就明白了的文章就介绍到这了,更多相关Java webSerivce内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

JavawebSerivce的使用看完你就明白了

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

8种ETL算法汇总大全!看完你就全明白了

> 算法应用场景概览 以上共计累积了8种ETL算法,其中主要分成4大类,增量累加、拉链算法是更符合数据仓库历史数据追踪的算法,但现实中基于业务及性能考虑,往往存在全删全插、增量累全算法的数据表应用。 2 全删全插模型 即Delete/Insert实现逻辑;
8种ETL算法汇总大全!看完你就全明白了
2020-09-10

为什么说自学“软考高项”难?看完你就明白了!

  我不是软件专业,因为工作需要想要考一个软考高级证书。尝试过自学软考高级-信息系统项目管理师,做了不少题,错题解析也能看懂,但分数一直上不去。  自我分析可能是对知识点没有一个清晰的框架,没有抓住考试重点。  基于对自己的清晰认知,我觉得我应该报个培训班系统学习一下软考-信息系统项目管理师。  一、备考经验  在网上
为什么说自学“软考高项”难?看完你就明白了!
2024-04-19

为什么说2024年自学“软考高项”难?看完你就明白了!

  广东深圳2023上半年软考高项合格人员共180人,当年合格人数占比约4.52%。这个数据是高还是低呢?和往年比是升了还是降了呢?软考高项接下来要怎么备考呢?  一、广东深圳软考高项历年分析  根据官方公布的信息:  广东深圳2023上半年软考高项合格人员共180人,当年合格人数占比约4.52%;  2022下半年合
为什么说2024年自学“软考高项”难?看完你就明白了!
2024-04-19

软考中级集成难不难考?看完考试大纲分析,你就明白了!

2024年系统集成项目管理工程师教程改版了,新版IT知识部分、10大管理知识部分和高级教材差不多。项目十大管理中的输入、输出、工具和技术,还有信息化IT方面的内容,占比分较大。并且2024改为一年考一次,取消了上半年考试,安排在下半年开考。
软考中级集成难不难考?看完考试大纲分析,你就明白了!
2024-08-24

软考一次过的概率大吗?看完软考通过率分析就明白了!

最近已经陆续有人拿到软考证书了,当然,也有不少人未能通过考试,只能下半年或者明年再战。而软考作为近些年的热门考试,每年的报考人数都不少,因此许多人十分好奇软考的通过率怎么样,是否有人一次就过。接下来小编就和大家分析一番软考通过率,一起来看看吧~
软考一次过的概率大吗?看完软考通过率分析就明白了!
2024-08-20

完美Python入门基础知识点总结,看完你的Python就完全入门了!

Python标识符在 Python 里,标识符有字母、数字、下划线组成。在 Python 中,所有标识符可以包括英文、数字以及下划线(_),但不能以数字开头。Python 中的标识符是区分大小写的。以下划线开头的标识符是有特殊意义的。以单下
2023-06-02

关于C++中sort()函数的用法,你搞明白了没

这篇文章主要介绍了关于C++中sort()函数的用法,并通过三种方法介绍了按降序排列的实现代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2023-03-09

【2023版】超详细XShell免费版的安装配置教程以及使用教程,看完这一篇就够了

目录 一、 XShell的作用 二、 下载免费版XShell 三、 安装XShell 四、使用XShell连接Linux服务器 一、 XShell的作用 XShell 是一种流行且简单的网络程序,旨在模拟虚拟终端。XShell可以在
2023-08-30

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录