Springboot 搭建WebService客户端+服务端

news2024/11/24 19:17:27

WebService简介

Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。依据Web Service规范实施的应用之间, 无论它们所使用的语言、 平台或内部协议是什么, 都可以相互交换数据。

简单的说,WebService就是一种跨编程语言和跨操作系统平台的远程调用技术。所谓跨编程语言和跨操作平台,就是说服务端程序采用java编写,客户端程序则可以采用其他编程语言编写,反之亦然。跨操作系统平台则是指服务端程序和客户端程序可以在不同的操作系统上运行。 远程调用,就是一台计算机的应用可以调用其他计算机上的应用。例如:支付宝,支付宝并没有银行卡等数据,它只是去调用银行提供的接口来获得数据。还有天气预报等,也是气象局把自己的系统服务以webservice服务的形式暴露出来,让第三方网站和程序可以调用这些服务功能。

WebService原理

XML,SOAP和WSDL就是构成WebService平台的三大技术 。

  • WebService采用Http协议来在客户端和服务端之间传输数据。WebService使用XML来封装数据,XML主要的优点在于它是跨平台的。

  • WebService通过HTTP协议发送请求和接收结果时,发送的请求内容和结果内容都采用XML格式封装,并增加了一些特定的HTTP消息头,以说明HTTP消息的内容格式,这些特定的HTTP消息头和XML内容格式就是SOAP协议规定的。

  • WebService服务器端首先要通过一个WSDL文件来说明自己有什么服务可以对外调用。简单的说,WSDL就像是一个说明书,用于描述WebService及其方法、参数和返回值。 WSDL文件保存在Web服务器上,通过一个url地址就可以访问到它。客户端要调用一个WebService服务之前,要知道该服务的WSDL文件的地址。WebService服务提供商可以通过两种方式来暴露它的WSDL文件地址:1.注册到UDDI服务器,以便被人查找;2.直接告诉给客户端调用者。

WebService交互的过程就是,WebService遵循SOAP协议通过XML封装数据,然后由Http协议来传输数据。

JAVA WebService规范

Java 中共有三种WebService 规范,分别是JAXM&SAAJ、JAX-WS(JAX-RPC)、JAX-RS。

(1)JAX-WS:

JAX-WS(Java API For XML-WebService)。早期的基于SOAP 的JAVA 的Web 服务规范JAX-RPC(java API For XML-Remote Procedure Call)目前已经被JAX-WS 规范取代,JAX-WS 是JAX-RPC 的演进版本,但JAX-WS 并不完全向后兼容JAX-RPC,二者最大的区别就是RPC/encoded 样式的WSDL,JAX-WS 已经不提供这种支持。JAX-RPC 的API 从JAVA EE5 开始已经移除,如果你使用J2EE1.4,其API 位于javax.xml.rpc.包。JAX-WS(JSR 224)规范的API 位于javax.xml.ws.包,其中大部分都是注解,提供API 操作Web 服务(通常在客户端使用的较多,由于客户端可以借助SDK 生成,因此这个包中的API 我们较少会直接使用)。

(2)JAXM&SAAJ:

  • JAXM(JAVA API For XML Message)主要定义了包含了发送和接收消息所需的API,相当于Web 服务的服务器端,其API 位于javax.messaging.*包,它是Java EE 的可选包,因此你需要单独下载。

  • SAAJ(SOAP With Attachment API For Java,JSR 67)是与JAXM 搭配使用的API,为构建SOAP 包和解析SOAP 包提供了重要的支持,支持附件传输,它在服务器端、客户端都需要使用。这里还要提到的是SAAJ 规范,其API 位于javax.xml.soap.*包。

  • JAXM&SAAJ 与JAX-WS 都是基于SOAP 的Web 服务,相比之下JAXM&SAAJ 暴漏了SOAP更多的底层细节,编码比较麻烦,而JAX-WS 更加抽象,隐藏了更多的细节,更加面向对象,实现起来你基本上不需要关心SOAP 的任何细节。那么如果你想控制SOAP 消息的更多细节,可以使用JAXM&SAAJ。

(3)JAX-RS:

JAX-RS 是JAVA 针对REST(Representation State Transfer)风格制定的一套Web 服务规范,由于推出的较晚,该规范(JSR 311,目前JAX-RS 的版本为1.0)并未随JDK1.6 一起发行。

WebService入门案例

服务端的实现

我们来实现一个天气系统的案例,客户端发送城市名称,服务器端回应相应的天气。

// 1.  编写SEI(Service Endpoint Interface),SEI在webservice中称为portType,在java中就是普通接口 
package com.wdx.webservice.test2service;

public interface WeatherInterface {
    public String queryWeather(String cityName);
}
//2.  编写SEI实现类,此类作为webservice提供服务类
package com.wdx.webservice.test2service;

import javax.jws.WebService;

@WebService     //@WebService表示该类是一个服务类,需要发布其中的public的方法
public class WeatherInterfaceImpl implements WeatherInterface {

    @Override
    public String queryWeather(String cityName) {
        System.out.println("获取城市名"+cityName);
        String weather="暴雨";
        return weather;
    }

}
// 3.  第三步:发布服务,Endpoint类发布服务,publish方法,两个参数:1.服务地址;2.服务实现类 

public class WeatherServer {
    public static void main(String[] args) {
        Endpoint.publish("http://127.0.0.1:12345/weather", new WeatherInterfaceImpl());
    }
}

//4. 测试服务是否发布成功,通过阅读wsdl,确定客户端调用的接口、方法、参数和返回值存在,证明服务发布成功
//我们在浏览器输入 http://127.0.0.1:12345/weather?wsdl 来获取wsdl文件进行阅读
//wsdl,是以XML文件形式来描述WebService的”说明书”,有了说明书,我们才可以知道如何使用或是调用这个服务.
//现在我们还不知道怎么去阅读,后面我们会详解,只要能获取到,就能确定WebService服务发布成功 

在这里插入图片描述

客户端实现

//客户端调用服务有很多种方法,我们先用工具生成客户端代码,后面会详解  

//wsimport是jdk自带的webservice客户端工具,可以根据wsdl文档生成客户端调用代码(java代码).当然,无论服务器端的WebService是用什么语言写的,都可以生成调用webservice的客户端代码。

1.创建一个客户端空项目,cmd命令行进入此项目的src目录
  使用以下命令生成客户端代码  

    wsimport -s . http://127.0.0.1:12345/weather?wsdl

    -s是指编译出源代码文件,后面的.(点)指將代码放到当前目录下.
     最后面的http….是指获取wsdl说明书的地址

在这里插入图片描述
在生成的目录文件中新建客户端

//2.编写客户端
public class WeatherClient {

    public static void main(String[] args) {
        //创建服务视图,视图是从wsdl文件的service标签的name属性获取
        WeatherInterfaceImplService weatherInterfaceImplService=new WeatherInterfaceImplService();  

        //获取服务实现类,实现类从wsdl文件的portType的name属性获取
        WeatherInterfaceImpl weatherInterfaceImpl=weatherInterfaceImplService.getPort(WeatherInterfaceImpl.class); 
        //获取查询方法,从portType的operation标签获取
        String weather=weatherInterfaceImpl.queryWeather("北京");
        System.out.println(weather);

    }

}

至此,我们的客户端就可以获取远程服务端的数据,接下来我们来详解一下各个部分。

WSDL

WSDL(Web Services Description Language), web服务描述语言,他是webservice服务端使用说明书,说明服务端接口、方法、参数和返回值,WSDL是随服务发布成功,自动生成,无需编写。

文档结构

在这里插入图片描述

  • Service:相关端口的集合,包括其关联的接口、操作、消息等。
  • Binding:特定端口类型的具体协议和数据格式规范
  • portType: 服务端点,描述 web service可被执行的操作方法,以及相关的消息,通过binding指向portType
  • message: 定义一个操作(方法)的数据参数
  • types: 定义 web service 使用的全部数据类型

阅读方式

WSDL文档应该从下往上阅读。

1.先看service标签,看相应port的binding属性,然后通过值查找上面的binding标签。
2.通过binding标签可以获得具体协议等信息,然后查看binding的type属性
3.通过binding的type属性,查找对应的portType,可以获得可操作的方法和参数、返回值等。
4.通过portType下的operation标签的message属性,可以向上查找message获取具体的数据参数信息。

阅读wsdl文档构建客户端

  1. 根据wsdl:service 选择出port,由于我们这里使用的是http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl,所以port为MobileCodeWSSoap
    在这里插入图片描述

  2. 根据wsdl:port 值观察wsdl:binding ,在其中根据wsdl:operation 选择需要的方法名(比如getMobileCodeInfo)
    在这里插入图片描述

  3. 根据wsdl:binding 的type值去找到wsdl:portType 和wsdl:operation 知道它的输入和输出
    在这里插入图片描述
    知道输入为tns:getMobileCodeInfoSoapIn;输出为tns:getMobileCodeInfoSoapOut

  4. 在wsdl:message 中寻找输入输出
    在这里插入图片描述

  5. 在wsdl:types的s:element 找到message的对应值,并在其中的xs:complexType 的对应xs:sequence确定方法的输入输出类型和个数
    在这里插入图片描述

python的客户端构造

from suds.client import Client
import logging

try:
    client = Client('http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl')
    print(client)
    # result = client.service.__getattr__("getMobileCodeInfo")('15118888888')
    result = client.service.__getattr__("getDatabaseInfo")()
except Exception as e:
    logging.error(e)
    # return []
print(type(result))
    # return result
print(result)

java的客户端构造

import cn.com.webxml.MobileCodeWSSoap;

import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import java.io.IOException;
import java.net.URL;

public class MobileClient2 {

    public static void main(String[] args) throws IOException {
        //创建WSDL文件的URL
        URL wsdlDocumentLocation=new URL("http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl");
        //创建服务名称
        //1.namespaceURI - 命名空间地址
        //2.localPart - 服务视图名
        QName serviceName=new QName("http://WebXml.com.cn/","MobileCodeWS");
        Service service= Service.create(wsdlDocumentLocation, serviceName);

        //获取服务实现类
        MobileCodeWSSoap mobileCodeWSSoap= service.getPort(MobileCodeWSSoap.class);
        //调用方法
        String message=mobileCodeWSSoap.getMobileCodeInfo("15118888888", null);
        System.out.println(message);

    }

}

SOAP

SOAP即简单对象访问协议,他是使用http发送的XML格式的数据,它可以跨平台,跨防火墙,SOAP不是webservice的专有协议。

SOAP=http+xml

SOAP结构

必需的 Envelope 元素,可把此 XML 文档标识为一条 SOAP 消息
可选的 Header 元素,包含头部信息
必需的 Body 元素,包含所有的调用和响应信息
可选的 Fault 元素,提供有关在处理此消息所发生错误的信息

Webservice的客户端调用方式

一:生成客户端调用方式

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

调用公网的手机归属地查询服务
公网服务地址 (里面提供了很多免费调用的服务)

http://www.webxml.com.cn/zh_cn/index.aspx

第一步:wsimport生成客户端代码 

wsimport -p cn.cad.mobile -s . http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl

会出现一些警告,是因为服务端提供的一些方法是SOAP1.2标准的,这个工具没有实现SOAP1.2标准的生成方式。    

在这里插入图片描述

 第二步:查看wsdl文件,获取我们需要的信息 

在这里插入图片描述

//第三步:根据获取到的服务名等信息来创建我们的客户端  

public class MobileClient {

    public static void main(String[] args) {
        //创建服务视图
        MobileCodeWS mobileCodeWS=new MobileCodeWS();
        //获取服务实现类
        MobileCodeWSSoap mobileCodeWSSoap= mobileCodeWS.getPort(MobileCodeWSSoap.class);
        //调用查询方法
        String message=mobileCodeWSSoap.getMobileCodeInfo("xxxxxxxx", null);
        System.out.println(message);

    }
}

在这里插入图片描述

该种方式使用简单,但一些关键的元素在代码生成时写死在生成代码中,不方便维护,所以仅用于测试。

二:service编程调用方式

public class MobileClient2 {

    public static void main(String[] args) throws IOException {
        //创建WSDL文件的URL
        URL wsdlDocumentLocation=new URL("http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl"); 
        //创建服务名称
        //1.namespaceURI - 命名空间地址
        //2.localPart - 服务视图名
        QName serviceName=new QName("http://WebXml.com.cn/","MobileCodeWS");
        Service service=Service.create(wsdlDocumentLocation, serviceName);

        //获取服务实现类
        MobileCodeWSSoap mobileCodeWSSoap= service.getPort(MobileCodeWSSoap.class);
        //调用方法
        String message=mobileCodeWSSoap.getMobileCodeInfo("XXXXXXX", null);
        System.out.println(message);

    }

}

该种方式可以自定义命名空间,服务视图名等元素,方便以后维护,是一种标准的开发方式 。

三:HttpURLConnection调用方式

这种方式是由自己编写客户端,不再由工具生成,比较麻烦。

开发步骤: 

        第一步:创建服务地址

        第二步:打开一个通向服务地址的连接

        第三步:设置参数

        第四步:组织SOAP数据,发送请求

        第五步:接收服务端响应 

使用注解修改WSDL内容

作用:
通过注解,可以更加形像的描述Web服务。对自动生成的wsdl文档进行修改,为使用者提供一个更加清晰的wsdl文档

WebService的注解都位于javax.jws包下:

@WebService-定义服务,在类上边
    targetNamespace:指定命名空间
    name:portType的名称
    portName:port的名称
    serviceName:服务名称
    endpointInterface:SEI接口地址,如果一个服务类实现了多个接口,只需要发布一个接口的方法,可通过此注解指定要发布服务的接口。 

@WebMethod-定义方法,在公开方法上边
    operationName:方法名
    exclude:设置为true表示此方法不是webservice方法,反之则表示webservice方法,默认是false 

@WebResult-定义返回值,在方法返回值前边
    name:返回结果值的名称 

@WebParam-定义参数,在方法参数前边
    name:指定参数的名称
//以我们前面做的天气案例为例子

@WebService(
        targetNamespace="http://service.cad.com",
        portName="WeatherSOAPPort",
        serviceName="WeatherWSS",
        name="WeatherSOAP"  
)
public class WeatherInterfaceImpl implements WeatherInterface {

    @WebMethod(
            operationName="getWeather",
            exclude=false
    )
    public @WebResult(name="result")String queryWeather(@WebParam(name="cityName")String cityName) {
        System.out.println("获取城市名"+cityName);
        String weather="暴雨";    
        return weather;
    }

}

然后重新发布服务,我们再访问wsdl文件,就可以看到我们改变的内容

在这里插入图片描述

参考链接:Java实现简单的web Service_java webservice接口开发_马粥叔的博客-CSDN博客
如有侵权请联系立删

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/549208.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件设计和架构设计

软件设计和架构设计 1.软件设计 1.1设计 设计是从架构 构件 接口以及系统其他特征定义的过程。 软件设计的结果必须描述系统的架构&#xff0c;系统如何分解和组织构件。 描述构件间的接口。 描述构件必须详细到可进一步构造的程度。 设计是把分析模型转换成设计模型的过…

三个帮助你整理信息的桌面 WiKi

如果你想在桌面上感受 wiki&#xff0c;而不用做那些复杂的工作&#xff0c;这很容易做到。这有一些轻量级 wiki&#xff0c;可以帮助你组织你的信息、跟踪你的任务、管理你的笔记等等。 这个词时&#xff0c;可能会想到 MediaWiki 或 DokuWiki 这样的例子。它们开源、好用、强…

Go 并发之channel(通道)

一、前言 作为 Go 语言最有特色的数据类型&#xff0c;通道&#xff08;channel&#xff09;完全可以与 goroutine&#xff08;也可称为 go 程&#xff09;并驾齐驱&#xff0c;共同代表 Go 语言独有的并发编程模式和编程哲学。 通道&#xff08;channel&#xff09;可以利用…

TOGAF架构开发方法—G阶段:实施治理

本章提供了对实现的体系结构监督。 一、目标 G阶段的目标是&#xff1a; 通过实施项目确保符合目标架构为解决方案和任何实施驱动的架构更改请求执行适当的架构管理功能 二、 输入 本节定义阶段 G 的输入。 1 、企业外部参考物质 架构参考资料 2、 非架构输入 架构工作请…

K8s之污点、容忍度与Pod重启策略详解

文章目录 一、污点-Taint二、容忍度-Tolerations二、Pod重启策略1、Pod常见状态2、Pod重启策略 一、污点-Taint 在 Kubernetes 中&#xff0c;污点&#xff08;Taint&#xff09;是一种标记&#xff0c;用于标识一个Node节点上的某些资源或条件不可用或不可接受。当一个节点被…

基于springboot的社区疫情防控平台

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SpringBoot 前端&#xff1a;HTML、Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 前言 基于springboot…

模板类与友元

目录 分类 一、非模板友元&#xff1a;友元函数不是模板函数&#xff0c;而是利用模板类参数生成的函数&#xff1b; 代码 分析 运行结果 二、约束模板友元&#xff1a;模板类实例化时&#xff0c;每个实例化的类对应一个友元函数&#xff1b;并且这个模板友元适用多种类模…

AtCoder Beginner Contest 302(A-D)

TOYOTA MOTOR CORPORATION Programming Contest 2023#2 (AtCoder Beginner Contest 302) Contest Duration: 2023-05-20(Sat) 20:00 - 2023-05-20(Sat) 21:40 (local time) (100 minutes) 暴搜场&#xff0c;1个小时出了4道&#xff0c;以为很有机会&#xff0c;结果E交了十发没…

栈和队列OJ题:LeetCode--232.用栈实现队列

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;今天给大家带来的是LeetCode--232.用栈实现队列 数 据 结 构 专 栏&#xff1a;数据结构 个 人 主 页 &#xff1a;stackY、 LeetCode 专 栏 &#xff1a;LeetCode刷题训练营 LeetCode--232.用栈实现队列&#xff…

使用 compose 封装一个通用的关于页面库

前言 现在很多 APP 都会有一个关于页面&#xff0c;用于放置一些必要的信息&#xff0c;例如&#xff1a;版本号、版权信息等。有时也会用于展示设置、帮助、反馈等功能的入口。 通常&#xff0c;我们都会自己挨个创建不同的 item &#xff0c;略显繁琐。 所以我就在想&…

ad18学习笔记一

如何自学altium designer如何自学altium designer&#xff1f; - 知乎如何自学altium designer 这里面有ad官方推荐的b站的视频&#xff1a;可以直接去b站关注ad官方账号 AltiumChina&#xff0c;它本身就发布了很多实用教程。 在知乎的这个界面也有Altium Designer Ver18_官…

万字长文,为你送上全网最全Flutter学习资料!

话不多说直接上目录&#xff0c;干货较多内容很长&#xff0c;建议先收藏供以后慢慢查阅。 目录 文章视频组件导航模板插件框架实验性游戏开源App实用工具社区书籍福利 文章 介绍 Google IO 2018 [1.1K&#x1f44f;] - 构建美观&#xff0c;灵活的用户界面。Presentation …

Stm32待机模式的进入与唤醒

1.基础介绍 1-1&#xff1a;单片机的“低功耗模式”&#xff0c;像是手机的待机模式&#xff0c;不同于正常运行模式&#xff0c;处于一种省电省资源的状态 1-2&#xff1a;在运行情况下&#xff0c;HCLK为cpu提供时钟&#xff0c;cortex-m3内核执行程序的代码&#xff0c;如…

CleanMyMac X2023Mac上下载最多的第三个实用程序

CleanMyMac X是一款广为人知的Mac优化应用程序&#xff0c;目前是Mac上下载最多的第三个实用程序&#xff0c;并获得苹果官方认证。为了满足用户更好体验Mac和新版系统&#xff0c;它们带来了新功能。这新功能可以帮助用户更好的监控Mac的健康状况&#xff0c;让用户畅享Mac新系…

base编码

https://www.qqxiuzi.cn/bianma/base64.htm 一眼就解密 一看就晓得是base64&#xff0c;问就是做多了&#xff08;base64大小写加数字和&#xff09; base编码概念 此博客列举的比较多&#xff0c;我信 https://blog.csdn.net/qq_53105813/article/details/127626450 简单聊几个…

少儿编程 中国电子学会图形化编程等级考试Scratch编程三级真题解析(选择题)2023年3月

2023年3月scratch编程等级考试三级真题 选择题(共25题,每题2分,共50分) 1、计算“2+4+8+……+128”,用变量n表示每项,根据变化规律,变量n的赋值用下列哪个最合适 A、 B、 C、 D、 答案:D 考点分析:考查数学逻辑推理能力,从给定的算式中可以看出后一项都是前一…

redis 数据库概述

一 概述 redis是一种nosql数据库,他的数据是保存在内存中&#xff0c;同时redis可以定时把内存数据同步到磁盘&#xff0c;即可以将数据持久化&#xff0c;并且他比memcached支持更多的数据结构(string,list列表[队列和栈],set[集合],sorted set[有序集合],hash(hash表))。相关…

基于springboot篮球竞赛预约平台

开发技术与环境配置 以Java语言为开发工具&#xff0c;利用了当前先进的springboot框架&#xff0c;以MyEclipse10为系统开发工具&#xff0c;MySQL为后台数据库&#xff0c;开发的一个篮球竞赛预约平台。 SpringBoot框架 SpringBoot是一个全新开源的轻量级框架。基于Spring…

Callback CBFS .NET 2022所有产品打包Crack

Callback CBFS .NET 所有产品打包 Callback Technologies CBFS Storage 2022 .NET Edition v22.0.8517 Callback Technologies CBFS Filter 2022 .NET Edition v22.0.8485 Callback Technologies CBFS Disk 2022 .NET Edition v22.0.8464 Callback Technologies CBFS Connect …

UART-STM32

UART-STM32 通信的目的:将一个设备的数据传送到另一个设备,扩展硬件系统 通信协议:制定通信的规则,通信双方按照协议规则进行数据收发 第一步,开启时钟,把需要用的USART和GPIO的时钟打开 第二步,GPIO初始化,把TX配置成复用输出,RX配置成输入 第三步,配置USART,直接使…