WebService 简介和入门 Demo

简介

  • WebService 即 web 服务,它是一种跨语言跨操作系统平台的远程调用技术,适用于不同系统不同平台的数据交互传递。
  • Java 中一共有三种 WebService 规范,分别是 JAX-WS(基于WebService远程调用)、JAXM&SAAJJAX-RS (基于Restful)。
  • WebService 三要素:soapwsdluddi

WebService 开发规范

1.JAX-WS(Java API For XML-WebService)
        规范的 API 位于 javax.xml.ws.*,提供 API 操作 Web 服务(通常在客户端使用的比较多)。客户端和服务端通讯采用 SOAP 协议。
2.JAXM&SAAJ
        JAXM(Java API For XML Message)主要定义包含了发送和接受消息所需的API,相当于 Web 服务的服务器端,API 位于 javax.messaging.*包,是 JavaEE 的可选包,需要单独下载。需要控制 SOAP 消息的更多细节,可以使用 JAXM&SAAJ。
3.JAX-RS
        JAX-RS 是 Java 针对 REST(RepresentationState Transfer)风格制定的 Web 服务规范。需要到 JCP 上单独下载 JAX-RS 规范的接口,其 API 位于 javax.ws.rs.*,采用的是 HTTP 协议。


SOAP 协议

1.SOAP 即简单对象访问协议(Simple Object Access Protocol),用于交换 XML 编码信息的轻量级协议。SOAP 可以运行在任何其他传输协议上。
2.SOAP 作为一个基于 XML 语言的协议用于有网络传输数据。
3.SOAP = 在 HTTP 的基础上 + XML 数据
4.SOAP 是基于 HTTP 的
5.SOAP 的组成如下:
        a)Envelope:必选。以 XML 的根元素出现。
        b)Header:可选。
        c)Body:必选。包含要执行的服务器的方法和发送到服务器的数据。


wsdl 说明书

WebService 描述语言 WSDL(WebService Definition Language)就是用于机器能阅读的方式,提供一种正式描述文档基于 XML 语言。用于描述 WebService 及其函数、参数和返回值。由于是 XML ,所以机器和人都可阅读。


UDDI

如果需要将 Web 服务公布到网上,需要使用 UDDI,UDDI 是一个跨产业,跨平台的开放性架构,企业可以通过 UDDI 来注册和所有 Web 服务。简单来说,UDDI 就是一个目录,这个目录存放一些关于 Web 服务信息而已。UDDI 通过 SOAP 进行通讯,构建与 .Net 之上。UDDI 即 Universal Description,Discovery and Integration,也就是通用的描述,发现以及整合。


面向服务架构 SOA

SOA(Service-Oriented Architecture)面向服务架构,是一种思想,将应用程序通过不同功能单元通过中立的契约联系起来,使得更重形式的功能单元更好的集成。WebService 是 SOA 较好的实现方式,采用 HTTP 作为传输协议,SOAP 作为消息格式,但不完全符合 SOA 的概念,因为 SOAP 协议是 WebService 特有的协议,并未完全符合 SOA 的传输协议透明化的要求。


JAXWS Quick Start

项目结构如下
在这里插入图片描述

服务端

1.Pom 导入依赖

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

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

2.编写接口

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

3.编写接口实现类

public class HelloServiceImpl implements HelloService {
    @Override
    public String sayHello(String name) {
        return name + ", Glad you came";
    }
}

4.编写服务端主类

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

5.启动服务,访问端口 http://localhost:8000/ws/hello?wsdl,可以看到下面的 WebService 定义语言的 XML。
在这里插入图片描述

客户端

1.Pom 导入依赖,和服务端一致
2.编写和服务端一样的接口

@WebService
public interface HelloService {
    String sayHello(String name);
}

3.编写客户端主类

public class Client {
    public static void main(String[] args) {
        // 服务接口访问地址:http://localhost:8000/ws/hello
        // 创建 cxf 代理工厂
        JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
        // 设置远程访问服务端地址
        factory.setAddress("http://localhost:8000/ws/hello");
        // 设置接口类型
        factory.setServiceClass(HelloService.class);
        // 对接口生成代理对象
        HelloService helloService = factory.create(HelloService.class);
        // 调用代理对象的方法
        String ret = helloService.sayHello("Tony Stark");
        // 打印结果
        System.out.println(ret);
    }
}

4.运行主类,查看结果

Tony Stark, Glad you came

通过配置日志拦截器查看 SOAP 协议内容

1.在服务端类 Pom 中添加日志依赖

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.7</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>1.1.7</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-access</artifactId>
            <version>1.1.7</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.1.7</version>
        </dependency>

2.在服务端添加简易版的 logback.xml

<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <!-- ConsoleAppender 控制台输出日志 -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>
                <!-- 设置日志输出格式 -->
                %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger - %msg%n
            </pattern>
        </encoder>
    </appender>
    <root>
        <!-- 打印debug级别日志及以上级别日志 -->
        <level value="INFO" />
        <!-- 控制台输出 -->
        <appender-ref ref="console" />
    </root>
</configuration>

3.在服务端主类添加日志拦截代码

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

4.再次在客户端调用,可以在控制台看到详细的调用的地址,参数,状态码,请求的类型等。

----------------------------
ID: 1
Address: http://localhost:8000/ws/hello
Encoding: UTF-8
Http-Method: POST
Content-Type: text/xml; charset=UTF-8
Headers: {Accept=[*/*], Cache-Control=[no-cache], connection=[keep-alive], Content-Length=[199], content-type=[text/xml; charset=UTF-8], Host=[localhost:8000], Pragma=[no-cache], SOAPAction=[""], User-Agent=[Apache CXF 3.3.2]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:sayHello xmlns:ns2="http://service.maple.org/"><arg0>Tony Stark</arg0></ns2:sayHello></soap:Body></soap:Envelope>
--------------------------------------
2019-06-06 23:47:10.001 INFO  org.apache.cxf.services.HelloServiceImplService.HelloServiceImplPort.HelloService - Outbound Message
---------------------------
ID: 1
Response-Code: 200
Encoding: UTF-8
Content-Type: text/xml
Headers: {}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:sayHelloResponse xmlns:ns2="http://service.maple.org/"><return>Tony Stark, Glad you came</return></ns2:sayHelloResponse></soap:Body></soap:Envelope>
--------------------------------------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值