首页 > 代码库 > Webservice详解

Webservice详解

WebService是什么? 

  1. 基于Web的服务:服务器端整出一些资源让客户端应用访问(获取数据)

  2. 一个跨语言、跨平台的规范(抽象)

  3. 多个跨平台、跨语言的应用间通信整合的方案(实际)

  以各个网站显示天气预报功能为例: 

    气象中心的管理系统将收集的天气信息并将数据暴露出来(通过WebService Server), 而各大站点的应用就去调用它们得到天气信息并以不同的样式去展示(WebService Client)。网站提供了天气预报的服务,但其实它们什么也没有做,只是简单了调用了一下气象中心服务器上的一个服务接口而已。

  4. WebService的优点:能够解决跨平台,跨语言,以及远程调用之间的问题。

  5. WebService的应用场合

    a. 同一家公司的新旧应用之间

    b. 不同公司的应用之间,例如电商和物流之间的应用相互调用

    c. 一些提供数据的内容聚合应用:天气预报、股票行情

 

WebService预备知识

  几个重要术语

  1.WSDL/web service definition language

    webservice定义语言, 对应.wsdl文档, 一个webservice会对应一个唯一的wsdl文档, 定义了客户端与服务端发送请求和响应的数据格式和过程。

  2.SOAP/simple object access protocal

    一种简单的、基于HTTP和XML的协议, 用于在WEB上交换结构化的数据,在webservice中分为请求消息和响应消息。

  3.SEI/WebService EndPoint Interface

    webService服务器端用来处理请求的接口

  4.CXF/Celtix + XFire

    一个apache的用于开发webservice服务器端和客户端的框架

 

WebService开发

  开发方式:

    1. 使用JDK开发(JDK6及以上版本)

    2. 使用apache CXF开发(工作中)

  组成:

    1. 服务端开发

    2. 客户端开发

 

  一. 使用JDK开发webservice

  服务端

技术分享
/** * SEI * @author byron */@WebServicepublic interface HelloWs {        @WebMethod    public String sayHello(String name);    }/** * SEI的实现 * @author byron */@WebServicepublic class HelloWsImpl implements HelloWs {    @WebMethod    public String sayHello(String name) {        System.out.println("sayHello " + name);        return "hello " + name;    }}/** * 发布webservice * @author byron */public class WsPublish {    public static void main(String[] args) {        Endpoint.publish("http://192.168.1.106:8989/ws/hello", new HelloWsImpl());        System.out.println("发布Webservice 服务成功!");    }}
View Code

  发布的webservice服务的wsdl的URL为:http://192.168.1.106:8989/ws/hello?wsdl

 

  客户端:

     1. 进入生成客户端代码的目录,执行jdk自带的生成客户端代码的命令:wsimport -keep http://192.168.1.106:8989/ws/hello?wsdl

     2. 调用webservice服务

技术分享
/** * 调用webservice * @author byron */public class HelloClient {        public static void main(String[] args) {        HelloWsImplService hws = new HelloWsImplService();        HelloWs ws = hws.getHelloWsImplPort();        String result = ws.sayHello("Jack");        System.out.println("Result:" + result);    }}
View Code

 

  二. WSDL文件分析

  。。。。。

 

  三. 使用CXF开发WebService

  服务端

    添加apache CXF相关jar包,代码参照JDK开发无需修改

    使用maven构建项目时,在pom.xml添加如下依赖即可:

<dependency>    <groupId>org.apache.cxf</groupId>    <artifactId>cxf-rt-transports-http</artifactId>    <version>2.7.18</version></dependency>

  客户端

    下载apache cxf软件,解压后,设置环境变量CXF_HOME,将$CXF_HOME/bin加入PATH,然后可以使用wsdl2java生成客户端WebService代码,调用方式与JDK方式相同。

 

  1. CXF支持的数据类型

   基本类型:int/float/boolean等

   引用类型:String, 数组/List/Set/Map, 自定义类型(Student)

   示例代码:

技术分享
// 服务端代码@WebServicepublic interface DataTypeWS {    @WebMethod    public boolean addStudent(Student student);        @WebMethod    public Student getStudentById(int id);        @WebMethod    public List<Student> getStudentsByPrice(float price);        @WebMethod    public Map<Integer, Student> getAllStudentsMap();}@WebServicepublic class DataTypeWSImpl implements DataTypeWS {    @Override    public boolean addStudent(Student student) {        System.out.println("Server addStudent...");        return true;    }    @Override    public Student getStudentById(int id) {        System.out.println("Server getStudentById...");        return new Student(id, "Tom", 8500);    }    @Override    public List<Student> getStudentsByPrice(float price) {        System.out.println("Server getStudentsByPrice...");        List<Student> list = new ArrayList<>();        list.add(new Student(1, "Jim", price + 1000));        list.add(new Student(2, "Tim", price + 2000));        list.add(new Student(3, "Lim", price + 3000));        return list;    }    @Override    public Map<Integer, Student> getAllStudentsMap() {        System.out.println("Server getStudentsMap...");        Map<Integer, Student> map = new HashMap<>();        map.put(1, new Student(1, "Jim", 1000));        map.put(2, new Student(2, "Tim", 2000));        map.put(3, new Student(3, "Lim", 3000));        return map;    }}/** * 发布服务 */public class DataTypeServer {    public static void main(String[] args) {        Endpoint.publish("http://192.168.1.110:8990/ws/type", new DataTypeWSImpl());        System.out.println("发布 DataType Webservice 服务成功!");    }}
View Code

  使用wsdl2java命令生成客户端webservice代码,客户端调用代码如下:

技术分享
public class DataTypeClientTest {    @Test    public void testInteger() {        DataTypeWSImplService factory = new DataTypeWSImplService();        DataTypeWS dataTypeWS = factory.getDataTypeWSImplPort();        Student student = dataTypeWS.getStudentById(1);        System.out.println(student);    }        @Test    public void testObject() {        DataTypeWSImplService factory = new DataTypeWSImplService();        DataTypeWS dataTypeWS = factory.getDataTypeWSImplPort();        dataTypeWS.addStudent(new Student(10, "Tony", 12000));    }        @Test    public void testList() {        DataTypeWSImplService factory = new DataTypeWSImplService();        DataTypeWS dataTypeWS = factory.getDataTypeWSImplPort();        List<Student> students = dataTypeWS.getStudentsByPrice(5000);        for (Student stu : students) {            System.out.println(stu);        }    }        @Test    public void testMap() {        DataTypeWSImplService factory = new DataTypeWSImplService();        DataTypeWS dataTypeWS = factory.getDataTypeWSImplPort();        Return ret = dataTypeWS.getAllStudentsMap();        List<Entry> entrys = ret.getEntry();        for (Entry e : entrys) {            System.out.println(e.getKey() + ">>" + e.getValue());        }    }    }
View Code

  说明:调用成功说明CXF支持上述数据类型;将项目向CXF相关的jar包移除,让webservice以JDK api方式运行,验证得知JDK不支持Map类型.

 

  2. CXF拦截器

 

  3. CXF自定义拦截器

 

  4. 基于Spring的CXF webservice

 

  5. 基于spring的CXF拦截器

 

  6. 使用Ajax请求webservice

 

  7. 使用jQuery请求webservice

 

  8. 通过注解修改wsdl文档

 

Webservice详解