文章目录
简介
- webservice 即web服务,它是一种跨编程语言和跨操作系统平台的远程调用技术。
- JAVA 中共有三种WebService 规范,分别是JAX-WS(JAX-RPC)、JAXM&SAAJ、JAXRS
- webService三要素:soap、wsdl、uddi
SOAP 协议
- SOAP即简单对象访问协议(Simple Object Access Protocol),它是用于交换XML(标准通用标记语言下的一个子集)编码信息的轻量级协议。它有三个主要方面:XML-envelope为描述信息内容和如何处理内容定义了框架,将程序对象编码成为XML对象的规则,执行远程过程调用(RPC)的约定。SOAP可以运行在任何其他传输协议上。
- SOAP作为一个基于XML语言的协议用于有网上传输数据。
- SOAP = 在HTTP的基础上+XML数据,SOAP是基于HTTP的。
- SOAP的组成如下
a) Envelope – 必须的部分。以XML的根元素出现。
b) Headers – 可选的。
c) Body – 必须的。在body部分,包含要执行的服务器的方法。和发送到服务器的数据
wsdl说明书
Web Service描述语言WSDL(WebService Definition Language)就是用机器能阅读的方式提供的一个正式描述文档而基于XML的语言,用于描述Web Service及其函数、参数和返回值。因为是基于XML的,所以WSDL既是机器可阅读的,又是人可阅读的。
wsdl说明书
1) 通过wsdl说明书,就可以描述webservice服务端对外发布的服务;
2) wsdl说明书是一个基于xml文件,通过xml语言描述整个服务;
3) 在wsdl说明中,描述了:
对外发布的服务名称(类)
接口方法名称(方法)
接口参数(方法参数)
服务返回的数据类型(方法返回值)
详细介绍:wsdl文件详解
将Web服务公布到因特网上–UDDI
UDDI的话,是一个跨产业,跨平台的开放性架构,可以帮助Web 服务提供商在互联网上发布 Web 服务的信息。
UDDI 是一种目录服务,企业可以通过 UDDI 来注册和搜索 Web 服务。
应用场景
- 跨防火墙通信
- 应用系统集成
- 软件和数据重用
优缺点
优点
- 异构平台的互通性
理论上, Web Service 最大的优势是提供了异构平台的无缝街接技术手段。由于不同的用户使用不同的硬件平台,不同的操作平台,不同的操作系统,不同的软件,不同的协议通信,这就产生了互相通信的需求。 Web Service 使任何两个应用程序,只要能读写XML,那么就能互相通信 - 更广泛的软件复用(例如手机淘宝可以复用已有淘宝的业务逻辑.)
软件的复用技术通过组合已有模块来搭建应用程序,能大幅度提高软件的生产效率和质量。用户只要获得了描述 Web Service 的WSDL 文件,就可以方便地生成客户端代理,并通过代理访问 Web Service 。 - 迅捷的软件发行方式
(每个web Service称为一个生产者.不同的生产者可以相互协同合作完成整个应用)Web Service 将彻底地改变软件的发行方式。软件供应商可以把软件分解成若Web Service 模块构成的系统,直接在 Web 上发布。 - 最重要的一点(跨语言)
客户端与服务端可能是用不同的语言开发的,但是,通过webservice提供服务接口,客户端与服务端可以传递对象。
缺点
由于soap是基于xml传输,本身使用xml传输会传输一些无关内容从而影响效率,随着soap协议的完善,soap协议增加了许多内容,这样就导致了使用soap去完成简单的数据传输而携带的信息更多效率再受影响;
Web Service作为web跨平台访问的标准技术,很多公司都限定要求使用Web Service,但如果是简单的接口可以直接使用http传输自定义数据格式,开发更快捷。
面向服务架构SOA
SOA(Service-OrientedArchitecture)面向服务架构是一种思想,它将应用程序的不同功能单元通过中立的契约(独立于硬件平台、操作系统和编程语言)联系起来,使得各种形式的功能单元更好的集成。
通常采用SOA 的系统叫做服务总线(BUS),结构如下图所示:
ApacheCXF 框架实现WebService代码案例
webService服务端代码案例
需要的依赖
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.2.5</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>3.2.5</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http-jetty</artifactId>
<version>3.2.5</version>
</dependency>
服务端入口接口UserService
@WebService
public interface IUserService {
String sayHi(String name);
}
接口的实现类UserServiceImpl
public class UserServiceImpl implements IUserService {
@Override
public String sayHi(String name) {
return "hello" + name;
}
}
启动类
public static void main( String[] args )
{
// 服务工厂
JaxWsServerFactoryBean jaxWsServerFactoryBean = new JaxWsServerFactoryBean();
// 设置服务地址
jaxWsServerFactoryBean.setAddress("http://localhost:8000/user");
// 设置服务类
jaxWsServerFactoryBean.setServiceBean(new UserServiceImpl());
// 发布服务
jaxWsServerFactoryBean.create();
// 提示
System.out.println("服务端启动");
}
webService客户端代码案例
需要的依赖和服务端的一样
访问接口UserService
@WebService(targetNamespace = "http://webservice.com/")
//@WebService //如果包路径和服务端的包路径一只就可以直接用此注解,如果不一致就需要用上面的注解,上面的注解http后面的是服务端的包路径的倒置
public interface UserService {
String sayHi(String name);
}
访问类
JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean();
jaxWsProxyFactoryBean.setAddress("http://localhost:8000/user");
jaxWsProxyFactoryBean.setServiceClass(UserService.class);
UserService userService = jaxWsProxyFactoryBean.create(UserService.class);
String result = userService.sayHi("布鲁斯李");
System.out.println(result);
遇到的坑
1、客户端的访问接口的包路径要和服务端的访问接口的路径一致,否则会报错Unexpected wrapper element {http://client.webservice.com/}sayHi found. Expected {http://webservice.com/}sayHi.
,意思是期望地址是http://webservice.com/
,但是意外出现了http://client.webservice.com/
这个地址,也可以通过加上面代码中的注解属性也可以
2、客户端的访问接口中的方法名称要和服务端的一致,否则会报 Message part {http://webservice.com/}print was not recognized. (Does it exist in service WSDL?)
,原因是webservice 服务不存在或者方法名不对 ,
3、方法返回值类型要一致,
4、访问接口名和服务端的接口名可以不一致