文章目录

  • 简介
  • SOAP 协议
  • wsdl说明书
  • wsdl说明书
  • 将Web服务公布到因特网上--UDDI
  • 应用场景
  • 优缺点
  • 优点
  • 缺点
  • 面向服务架构SOA
  • ApacheCXF 框架实现WebService代码案例
  • webService服务端代码案例
  • webService客户端代码案例
  • 遇到的坑


简介

  1. webservice 即web服务,它是一种跨编程语言和跨操作系统平台的远程调用技术。
  2. JAVA 中共有三种WebService 规范,分别是JAX-WS(JAX-RPC)、JAXM&SAAJ、JAXRS
  3. webService三要素:soap、wsdl、uddi

SOAP 协议

  1. SOAP即简单对象访问协议(Simple Object Access Protocol),它是用于交换XML(标准通用标记语言下的一个子集)编码信息的轻量级协议。它有三个主要方面:XML-envelope为描述信息内容和如何处理内容定义了框架,将程序对象编码成为XML对象的规则,执行远程过程调用(RPC)的约定。SOAP可以运行在任何其他传输协议上。
  2. SOAP作为一个基于XML语言的协议用于有网上传输数据。
  3. SOAP = 在HTTP的基础上+XML数据,SOAP是基于HTTP的。
  4. 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 服务。

应用场景

  1. 跨防火墙通信
  2. 应用系统集成
  3. 软件和数据重用

优缺点

优点

  1. 异构平台的互通性
    理论上, Web Service 最大的优势是提供了异构平台的无缝街接技术手段。由于不同的用户使用不同的硬件平台,不同的操作平台,不同的操作系统,不同的软件,不同的协议通信,这就产生了互相通信的需求。 Web Service 使任何两个应用程序,只要能读写XML,那么就能互相通信
  2. 更广泛的软件复用(例如手机淘宝可以复用已有淘宝的业务逻辑.)
    软件的复用技术通过组合已有模块来搭建应用程序,能大幅度提高软件的生产效率和质量。用户只要获得了描述 Web Service 的WSDL 文件,就可以方便地生成客户端代理,并通过代理访问 Web Service 。
  3. 迅捷的软件发行方式
    (每个web Service称为一个生产者.不同的生产者可以相互协同合作完成整个应用)Web Service 将彻底地改变软件的发行方式。软件供应商可以把软件分解成若Web Service 模块构成的系统,直接在 Web 上发布。
  4. 最重要的一点(跨语言)
    客户端与服务端可能是用不同的语言开发的,但是,通过webservice提供服务接口,客户端与服务端可以传递对象。

缺点

由于soap是基于xml传输,本身使用xml传输会传输一些无关内容从而影响效率,随着soap协议的完善,soap协议增加了许多内容,这样就导致了使用soap去完成简单的数据传输而携带的信息更多效率再受影响;
Web Service作为web跨平台访问的标准技术,很多公司都限定要求使用Web Service,但如果是简单的接口可以直接使用http传输自定义数据格式,开发更快捷。

面向服务架构SOA

SOA(Service-OrientedArchitecture)面向服务架构是一种思想,它将应用程序的不同功能单元通过中立的契约(独立于硬件平台、操作系统和编程语言)联系起来,使得各种形式的功能单元更好的集成。

通常采用SOA 的系统叫做服务总线(BUS),结构如下图所示:

java请求SOAP协议 java soap协议_Web

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、访问接口名和服务端的接口名可以不一致