侧边栏壁纸
博主头像
coydone博主等级

记录学习,分享生活的个人站点

  • 累计撰写 306 篇文章
  • 累计创建 51 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

WebService

coydone
2022-11-05 / 0 评论 / 0 点赞 / 428 阅读 / 9,303 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-07-03,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

尚硅谷周阳2016:https://www.bilibili.com/video/BV1xE411d7hY

黑马程序员2018:https://www.bilibili.com/video/BV15t411S7V1

千峰2018:https://www.bilibili.com/video/BV1W4411M7c3

WebService基本概念

什么是Web服务

一些常见的Web服务:

  • 手机淘宝、京东等

  • 天气预报

  • 手机号归属地

  • 股票查询

  • 发手机短消息

  • 手机充值功能

  • 中英文翻译

  • 银行转账业务

  • 公司的“进销存系统”在某商品缺货时自动给供应商下订单

WebService简介

WebService即Web服务,它是一种跨编程语言和跨操作系统平台的远程调用技术。Java中共有三种WebService规范,分别是JAX-WS(JAX-RPC)、JAXM&SAAJ、JAX-RS。

WebService三要素:soap、wsdl、uddi。

术语

WebService开发规范

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

1、JAX-WS:JAX-WS(Java API For XML-WebService),JDK1.6 自带的版本为JAX-WS2.1,其底层支持为JAXB。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.*包,它是JavaEE的可选包,因此需要单独下载。

  • 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,目前版本为1.3。

3、JAX-RS:JAX-RS 是Java针对REST(RepresentationState Transfer)风格制定的一套Web服务规范,由于推出的较晚,该规范(JSR 311,目前JAX-RS 的版本为1.0)并未随JDK1.6 一起发行,需要到JCP上单独下载JAX-RS 规范的接口,其API 位于javax.ws.rs.*包。

这里的JAX-WS和JAX-RS规范我们采用Apache CXF作为实现,CXF是Objectweb Celtix和Codehaus XFire合并而成。CXF的核心是org.apache.cxf.Bus(总线),类似于Spring的ApplicationContext,Bus由BusFactory创建,默认是SpringBusFactory类,可见默认CXF是依赖于Spring的,Bus都有一个ID,默认的BUS的ID是cxf。要注意的是Apache CXF2.2 的发行包中的jar,如果直接全部放到lib目录,那么你必须使用JDK1.6,否则会报JAX-WS版本不一致的问题。对于JAXM&SAAJ 规范我们采用JDK中自带的默认实现。

SOAP协议

SOAP即简单对象访问协议(Simple Object Access Protocol),它是用于交换XML(标准通用标记语言下的一个子集)编码信息的轻量级协议。它有三个主要方面:XML-envelope为描述信息内容和如何处理内容定义了框架,将程序对象编码成为XML对象的规则,执行远程过程调用(RPC)的约定。SOAP可以运行在任何其他传输协议上。

SOAP作为一个基于XML语言的协议用于有网上传输数据。

SOAP = 在HTTP的基础上+XML数据。

SOAP是基于HTTP的。

SOAP的组成如下:

  • Envelope – 必须的部分。以XML的根元素出现。

  • Headers – 可选的。

  • Body – 必须的。在body部分,包含要执行的服务器的方法。和发送到服务器的数据。

WSDL说明书

WebService描述语言WSDL(SebService Definition Language)就是用机器能阅读的方式提供的一个正式描述文档而基于XML(标准通用标记语言下的一个子集)的语言,用于描述Web Service及其函数、参数和返回值。因为是基于XML的,所以WSDL既是机器可阅读的,又是人可阅读的。

WSDL说明书:

  • 通过WSDL说明书,就可以描述WebService服务端对外发布的服务;

  • WSDL说明书是一个基于xml文件,通过xml语言描述整个服务;

  • 在wsdl说明中,描述了:对外发布的服务名称(类)、接口方法名称(方法)、接口参数(方法参数)、服务返回的数据类型(方法返回值)。

UDDI

Web服务提供商又如何将自己开发的Web服务公布到因特网上,这就需要使用到UDDI了,UDDI是一个跨产业,跨平台的开放性架构,可以帮助Web服务提供商在互联网上发布Web服务的信息。

UDDI是一种目录服务,企业可以通过UDDI来注册和搜索Web服务。简单来时候话,UDDI就是一个目录,只不过在这个目录中存放的是一些关于Web服务的信息而已。并且UDDI通过SOAP 进行通讯,构建于.Net之上。

UDDI(Universal Description,Discovery and Integration),也就是通用的描述,发现以及整合。

UDDI的目的是为电子商务建立标准;UDDI是一套基于Web的、分布式的、为WebService提供的、信息注册中心的实现标准规范,同时也包含一组使企业能将自身提供的Web Service注册,以使别的企业能够发现的访问协议的实现标准。

应用场景

WebService可以适用于应用程序集成、软件重用、跨防火墙通信等需求。不同的业务要求不同。具体如下: 跨防火墙通信、应用系统集成、软件和数据重用。

简单来说,如果一个功能,需要被多个系统使用,可以使用WebService开发一个服务端接口,供不同的客户端应用。主要应用在企业内部系统之间的接口调用、面向公网的WebService服务。

优缺点

优点:

  • 异构平台的互通性。理论上, WebService最大的优势是提供了异构平台的无缝街接技术手段。由于不同的用户使用不同的硬件平台,不同的操作平台,不同的操作系统,不同的软件,不同的协议通信,这就产生了互相通信的需求。 WebService使任何两个应用程序,只要能读写XML,那么就能互相通信。

  • 更广泛的软件复用(例如手机淘宝可以复用已有淘宝的业务逻辑)。软件的复用技术通过组合已有模块来搭建应用程序,能大幅度提高软件的生产效率和质量。用户只要获得了描述WebService的WSDL文件,就可以生成客户端代理,并通过代理访问WebService。

  • 成本低、可读性强、应用范围广。WebService可用基于XML的SOAP来表示数据和调用请求。并且通过HTTP协议传输XML格式的数据。

  • 迅捷的软件发行方式。(每个WebService称为一个生产者,不同的生产者可以相互协同合作完成整个应用)WebService将彻底地改变软件的发行方式,软件供应商可以把软件分解成若WebService模块构成的系统,直接在Web上发布。

  • 跨语言。客户端与服务端可能是用不同的语言开发的,但是,通过WebService提供服务接口,客户端与服务端之前可以传递对象。

缺点:

  • 由于SOAP是基于xml传输,本身使用xml传输会传输一些无关内容从而影响效率,随着SOAP协议的完善,SOAP协议增加了许多内容,这样就导致了使用SOAP去完成简单的数据传输而携带的信息更多效率再受影响;

  • WebService作为Web跨平台访问的标准技术,很多公司都限定要求使用WebService,但如果是简单的接口可以直接使用http传输自定义数据格式,开发更快捷。

面向服务架构SOA

SOA(Service-Oriented Architecture)面向服务架构是一种思想,它将应用程序的不同功能单元通过中立的契约(独立于硬件平台、操作系统和编程语言)联系起来,使得各种形式的功能单元更好的集成。目前来说,WebService是SOA的一种较好的实现方式,WebService采用HTTP 作为传输协议,SOAP(Simple Object Access Protocol)作为传输消息的格式。但WebService 并不是完全符合SOA的概念,因为SOAP协议是WebService的特有协议,并未符合SOA的传输协议透明化的要求。SOAP是一种应用协议,早期应用于RPC的实现,传输协议可以依赖于HTTP、SMTP等。

Apache CXF框架

概述

Apache CXF = Celtix + XFire,ApacheCXF的前身叫Apache CeltiXfire,现在已经正式更名为 Apache CXF。CXF继承了Celtix 和XFire两大开源项目的精华,提供了对JAX-WS全面的支持,并且提供了多种Binding、DataBinding、Transport以及各种Format的支持,并且可以根据实际项目的需要,采用代码优先(Code First)或者WSDL优先(WSDL First)来轻松地实现Web Services的发布和使用。

Apache CXF 是一个开源的Services框架,CXF帮助您利用Frontend编程API来构建和开发 Services,像JAX-WS。这些Services可以支持多种协议,比如:SOAP、XML/HTTP、RESTfulHTTP或者CORBA,并且可以在多种传输协议上运行,比如:HTTP、JMS或者JBI,CXF 大大简化了Services的创建,同时它继承了XFire传统,一样可以天然地和Spring进行无缝集成。

功能特性

CXF包含了大量的功能特性,但是主要集中在以下几个方面:

  • 支持Web Services标准:CXF 支持多种 Web Services 标准,包含 SOAP、Basic Profile、WS-Addressing、WS-Policy、WS-ReliableMessaging 和 WS-Security。

  • Frontends:CXF 支持多种“Frontend”编程模型,CXF 实现了 JAX-WS API (遵循 JAX-WS 2.0 TCK 版本),它也包含一个“simple frontend”允许客户端和EndPoint的创建,而不需要 Annotation注解。CXF既支持WSDL优先开发,也支持从Java的代码优先开发模式。

  • 容易使用:CXF设计得更加直观与容易使用。有大量简单的API用来快速地构建代码优先的 Services,各种Maven的插件也使集成更加容易,支持JAX-WS API,支持Spring2.0更加简化的XML配置方式,等等。

  • 支持二进制和遗留协议:CXF 的设计是一种可插拨的架构,既可以支持 XML ,也可以支持非XML的类型绑定,比如:JSON和CORBA。

CXF实现WebService(Jax-ws)

Jax-ws:Java API for XML Web Services,基于Java开发的WebService。

服务端

1、新建Maven工程,导入依赖。添加日志文件。

<dependencies>
    <!-- 要进行jaxws服务开发 SOAP -->
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-frontend-jaxws</artifactId>
        <version>3.0.1</version>
    </dependency>

    <!-- 内置jetty web服务器 -->
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-transports-http-jetty</artifactId>
        <version>3.0.1</version>
    </dependency>

    <!-- 日志实现 -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.30</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.10</version>
        <scope>test</scope>
    </dependency>
</dependencies>

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.2</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                    <showWarnings>true</showWarnings>
                </configuration>
            </plugin>
        </plugins>
    </pluginManagement>
</build>

log4j.properties

# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE            debug   info   warn error fatal
log4j.rootCategory=info, CONSOLE, LOGFILE

# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE

# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n

# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=d:\axis.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n

2、编写对外发布服务的接口及其实现类。

import javax.jws.WebService;

//对外发布服务的接口
@WebService
public interface HelloService {
    String sayHello(String name);
}

public class HelloServiceImpl implements HelloService {
    @Override
    public String sayHello(String name) {
        return name + ",Welcome to coydone";
    }
}

3、编写发布服务的Server并访问。

import com.coydone.service.impl.HelloServiceImpl;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;

//发布服务
public class Server {
    public static void main(String[] args) {
        // 服务工厂
        JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();
        // 设置服务地址
        factory.setAddress("http://localhost:8000/ws/hello");
        // 设置服务类
        factory.setServiceBean(new HelloServiceImpl());

        //添加日志输入、输出拦截器,观察soap请求、soap响应内容
        factory.getInInterceptors().add(new LoggingInInterceptor());
        factory.getOutInterceptors().add(new LoggingOutInterceptor());

        // 发布服务
        factory.create();
        // 提示
        System.out.println("服务端启动");
        //访问 http://localhost:8000/ws/hello?wsdl 即可
    }
}

客户端

import com.coydone.service.HelloService;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
//pom文件、HelloService 同Server端
public class Client {
    public static void main(String[] args) {
        //服务接口访问地址:http://localhost:8000/ws/hello

        //1、创建cxf代理工厂
        JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
        //2、设置远程访问服务端地址
        factory.setAddress("http://localhost:8000/ws/hello");
        //3、设置接口类型
        factory.setServiceClass(HelloService.class);
        //4、对接口生成代理对象
        HelloService helloService = factory.create(HelloService.class);

        //代理对象对象
        System.out.println(helloService.getClass());

        //5、远程访问服务端方法
        String content = helloService.sayHello( "Tom");
        System.out.println(content); //Tom,Welcome to coydone
    }
}

客户端访问后,在服务端后台会出现日志信息。

Rest风格的WebService

<!--引入CXF开发RestFul webservice 的jar-->
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-frontend-jaxrs</artifactId>
    <version>3.1.6</version>
</dependency>
<!--restful的对象转为json的数据格式依赖jar-->
<dependency>
    <groupId>com.colobu</groupId>
    <artifactId>fastjson-jaxrs-json-provider</artifactId>
    <version>0.1.0</version>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.9</version>
</dependency>

0

评论区