Springboot整合WebService

1.1 概述

webservice web 服务,因互联网而产生,通过 webservice 这种 web 服务,我们可以实现互联网应
用之间的资源共享,比如我们想知道 手机号码归属地,列车时刻表,天气预报,省市区邮政编码等信
息,由于我们自己的数据库中并没有这些信息,那么我们可以调用第三方提供的 webservice 服务,获
取这些信息;
webservice 是一种系统之间进行调用的技术,系统之间调用的技术有: httpClient hessian
dubbo webservice 等; WebService 是一种跨越编程语言,跨越操作系统,跨越终端的远程调用技
术,比如一个系统是 Java 语言开发的,另一个系统是 PHP 语言开发的,他们之间要实现信息交互,则
可以使用 webservice 进行数据交互;
所以 webservice 实现了异构系统之间的通信,不管是采用什么语言编写的,不管部署在什么操作系统
平台上,使用 webservice 都可以实现信息的交换;
1.2 webservice 核心要素
SOAP
SOAP 英文全称为: Simple Object Access Protocol ,即简单对象访问协议,它是基于 xml 格式的
消息交换协议;
OAP 定义了信息交换的格式,它包含一个重要的信封 envelope ,使用信封 envelope 来包装要传递的信
息,使用命名空间 namespace 来区分传递的信息;简单来说,在 WebService 中传递的信息就是一封
信, SOAP 就是信的通用格式,它定义了一封信应该有信封,信封里装着信的内容;
信封( envlope )的格式是固定的,而信的内容(要传递的数据)可以自己定义; SOAP 协议传输的数据采用
xml 格式进行封装,采用 http 协议进行传输,即 soap=xml+http

 WSDL

WSDL 英文全称为 Web Service Description Language ,即 Web Service 描述语言;它使用 xml
Web Service 进行描述,比如提供服务的方法、参数、返回值、数据类型等信息进行描述;简单来说,
wsdl 就是 webservice 服务的使用说明书;
1.3 webservice 的使用场景
1 、应用系统集成
多个应用系统集成在一起,则需要信息交换或通信,那么可以采用 webservice 进行通信;
2 、异构系统之间通信
异构系统,主要是指编程语言不同的系统;不同系统之间,特别是开发语言不同的系统之间,可以通过
webservice 进行信息交换;
3 、软件复用
webservice 可以作为一个公共的服务,供客户端调用,避免软件重复开发工作;
1.4 webservice 的结构
服务端:提供服务,供客户端调用;
客户端:调用服务,获得服务的数据;

 

WebService 服务端是以远程接口为主的,在 Java 实现的 WebService 技术里主要依靠 CXF 开发框架,
而这个 CXF 开发框架可以直接将接口发布成 WebService
CXF 又分为 JAX-WS JAX-RS JAX-WS 是基于 xml 协议,而 JAX-RS 是基于 Restful 风格,两者的区别
如下:
RS 基于 Restful 风格, WS 基于 SOAP XML 协议
RS WS 传输的数据更少,效率更高
WS 只能传输 XML 数据, RS 可以传输 XML ,也可以传输 JSON

2. 服务端

2.1. maven 依赖
<!--WebService-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web-services</artifactId>
</dependency>
<!-- CXF webservice -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-spring-boot-starter-jaxws</artifactId>
<version>3.4.5</version>
</dependency>
等价于
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.1.6</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>3.1.6</version>
</dependency>

2.2. 新建接口 

package com.spp.springboot.service;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
//targetNamespace="包名的倒着写"
@WebService(targetNamespace = "http://service.springboot.spp.com")
public interface MyWebService {
@WebMethod
public String hello(@WebParam(name = "msg") String msg);
}
2.3. 接口实现类
package com.spp.springboot.service.impl;
import com.spp.springboot.service.MyWebService;
import org.springframework.stereotype.Service;
import javax.jws.WebService;
/**
* serviceName 与接口中指定的name一致
* targetNamespace 与接口中的命名空间一致,一般是接口的包名倒
* endpointInterface 接口地址
*/
@Service
@WebService(serviceName = "MyWebService",
targetNamespace = "http://service.springboot.spp.com",
endpointInterface = "com.spp.springboot.service.MyWebService")
public class MyWebServiceImpl implements MyWebService {
@Override
public String hello(String msg) {
return "你好。。。"+msg;
}
}
2.4. 配置类
Apache CXF 核心架构是以 BUS 为核心,整合其他组件。
Bus CXF 的主干 , 为共享资源提供一个可配置的场所,作用类似于 Spring ApplicationContext ,这些
共享资源包括 WSDl 管理器、绑定工厂等。通过对 BUS 进行扩展,可以方便地容纳自己的资源,或者替换现有的
资源。默认 Bus 实现基于 Spring 架构,通过依赖注入,在运行时将组件串联起来。 BusFactory 负责 Bus 的创
建。默认的 BusFactory SpringBusFactory ,对应于默认的 Bus 实现。在构造过程中,
SpringBusFactory 会搜索 META-INF/cxf (包含在 CXF jar 中)下的所有 bean 配置文件。根据这些配
置文件构建一个 ApplicationContext 。开发者也可以提供自己的配置文件来定制 Bus
@Configuration
public class WebServiceConfig {
@Autowired
private MyWebService myWebService;
@Bean(name = Bus.DEFAULT_BUS_ID)
public SpringBus springBus(){
return new SpringBus();
}
/**
* 设置WebService访问父路径
* @Bean name不能dispatcherServlet 否则会覆盖dispatcherServlet
* 或者 yml文件配置
* cxf.path=/webServices
* @return
*/
@Bean
public ServletRegistrationBean getRegistrayionBean(){
return new ServletRegistrationBean(new CXFServlet(),"/webServices/*");
}
/**
* 注册MyWebService接口到webservice服务
* @return
*/
@Bean
public Endpoint sweptpayEndpoint(){
EndpointImpl endpoint = new EndpointImpl(springBus(),myWebService);
//绑定后缀名称访问
endpoint.publish("/my");
return endpoint;
}
}

 3. 启动

 

4.通过命令生成客户端代码

在命令行输入命令(需要配置了 Java 环境变量):

wsimport -encoding [ 编码 ] -keep -p [ 包名 ] [ 发布的服务地址 ? wsdl]
-encoding 指定生成代码的编码格式
-keep 保存生成的代码
-p 指定包名
-Xnocompile 表示生成的代码不编译(就是不生成 .class 文件)
如下
wsimport -encoding utf8 -keep -p 包名 -Xnocompile wsdl 地址

 

 

使用生成的代码调用服务端提供的服务;

 

public class Client {
public static void main(String[] args) {
//1.创建一个webservice的客户端
MyWebService_Service myWebServiceService = new MyWebService_Service();
//2.获取远程服务接口对象
MyWebService myWebService =
myWebServiceService.getMyWebServiceImplPort();
//3.直接调用远程服务接口对象的方法
String hello = myWebService.hello("aaaa");
System.out.println(hello);
}
}

5. 客户端

新建客户端调用接口

JaxWsProxyFactoryBean Apache CXF 框架中的一个类,用于创建和配置 JAX-WS 客户端代理。它
提供了一种简单的方式来创建和配置 JAX-WS 客户端,以便与远程的 Web 服务进行通信。
使用 JaxWsProxyFactoryBean ,您可以通过以下步骤创建和配置 JAX-WS 客户端:
1. 创建 JaxWsProxyFactoryBean 对象。
2. 设置 Web 服务的地址( Endpoint Address )。
3. 设置 Web 服务的接口类。
4. 可选:设置其他配置,如用户名、密码、超时时间等。
5. 调用 create() 方法创建 JAX-WS 客户端代理对象。

 

 

package com.spp.springboot.client;
import com.spp.springboot.service.MyWebService;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.springframework.stereotype.Component;
public class Client {
public static void main(String[] args) {
JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new
JaxWsProxyFactoryBean();
//设置调用服务的 URL
jaxWsProxyFactoryBean.setAddress("http://localhost:8080/webServices/my?
wsdl");
//设置要调用的服务类
jaxWsProxyFactoryBean.setServiceClass(MyWebService.class);
//获取对象
MyWebService myWebService = (MyWebService)
jaxWsProxyFactoryBean.create();
String hello = myWebService.hello("web service");
System.out.println(hello);
}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值