一、WebService简介

  为了支持跨网络的机器间相互操作交互而设计,用于开发分布式的互操作的应用程序组件。

  Web Service服务通常被定义为一组模块化的API,它们可以通过网络进行调用,来执行远程系统的请求服务,而XML 是 Web Services 的基础。

二、快速入门

  • 将${JDK}\bin目录添加到path环境变量
  • 新建一个文件夹,打开命令行,并cd到该目录
  • 执行命令
  • wsimport -s . http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl
  • 新建Java工程,将文件夹下的内容拷贝到src目录
  • 创建测试类,测试功能
  •  public class TestService {
    public static void main(String[] args) {
    MobileCodeWS mobileCodeWS = new MobileCodeWS();
    MobileCodeWSSoap soap = mobileCodeWS.getMobileCodeWSSoap();
    String info = soap.getMobileCodeInfo("1886666", "");
    System.out.println(info);
    }
    }

三、SOAP(imple Object Access Protocol)

  使用HTTP协议传输XML格式的数据。

  • SOAP请求示例

     POST /InStock HTTP/1.1
    Host: www.example.org
    Content-Type: application/soap+xml; charset=utf-8
    Content-Length: nnn <?xml version="1.0"?>
    <soap:Envelope
    xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
    soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding"> <soap:Body xmlns:m="http://www.example.org/stock">
    <m:GetStockPrice>
    <m:StockName>IBM</m:StockName>
    </m:GetStockPrice>
    </soap:Body> </soap:Envelope>
  • SOAP响应示例

  •  HTTP/1.1 200 OK
    Content-Type: application/soap+xml; charset=utf-8
    Content-Length: nnn <?xml version="1.0"?>
    <soap:Envelope
    xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
    soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding"> <soap:Body xmlns:m="http://www.example.org/stock">
    <m:GetStockPriceResponse>
    <m:Price>34.5</m:Price>
    </m:GetStockPriceResponse>
    </soap:Body> </soap:Envelope>

四、WSDL(Web Services Description Language)

  • 网络服务描述语言是一种使用 XML 编写的文档。这种文档可描述某个 Web service, 例如服务的名称, 地址, 方法, 参数类型, 返回值类型等
  • Web服务的使用说明书
  • 每一个WebService都有一个对应的WSDL
  • WSDL地址组成 : 服务发布地址?wsdl
  • WSDL文档示例
     <message name="getTermRequest">
    <part name="term" type="xs:string"/>
    </message> <message name="getTermResponse">
    <part name="value" type="xs:string"/>
    </message> <portType name="glossaryTerms">
    <operation name="getTerm">
    <input message="getTermRequest"/>
    <output message="getTermResponse"/>
    </operation>
    </portType>

四、Apache CXF 框架

  • 主页: http://cxf.apache.org/

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

1、CXF提供的服务分为两种方式

  • JAX-WS

    • 全称是 JavaTM API forRESTful Web Services

  • JAX-RS

    • 全称是 Java API for RESTful Web Services

  • 关于JAX-WS与JAX-RS两者是不同风格的SOA架构。前者以动词为中心,指定的是每次执行函数。而后者以名词为中心,每次执行的时候指的是资源

  • JAX-RS是JAVA EE6 引入的一个新技术。

  • 是一个Java 编程语言的应用程序接口,支持按照表述性状态转移(REST)架构风格创建Web服务。JAX-RS使用了Java SE5引入的Java标注来简化Web服务的客户端和服务端的开发和部署。

  • 简单来理解两种方式的区别

    • JAX-WS是基于SOAP协议传输XML数据

    • JAX-RS是基于HTTP协议传输XML数据或JSON数据

2、使用CXF开发WebService服务端(JAX-RS)

  • RESTful

    • 一种软件架构风格,设计风格而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

  • RESTful的好处

    • 基于这种风格架构,软件编写可以更简洁

    • 基于HTTP协议, 支持多种消息格式,比如XML 、JSON

    • 更易于实现缓存机制

  • 创建Maven工程,类型为WAR

  • 引入坐标

    <!--cxf-rs的坐标 -->

 <dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxrs</artifactId>
<version>3.0.1</version>
</dependency>
<!-- 增强cxf-rs,可以处理json数据 -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-rs-extension-providers</artifactId>
<version>3.0.1</version>
</dependency>
<!-- 上面的依赖必须依赖此包 -->
<dependency>
<groupId>org.codehaus.jettison</groupId>
<artifactId>jettison</artifactId>
<version>1.3.7</version>
</dependency>
<!-- spring坐标 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<!--spring整合web开发 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
  • 创建实体类com.itheima.domain.User
 // 指定在序列化对象时,生成的根节点的名字
@XmlRootElement(name = "user")
public class User {
private int id;
private String name;
private int age;

public User() {
}
public User(int id, String name, int age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
  • 创建接口com.itheima.service.UserService

 public interface UserService {
// URL = http://localhost:8080/rs_server/webservice/userService/user
@POST
@Path("/user")
@Consumes({ "application/xml", "application/json" })
public void saveUser(User user);

// URL = http://localhost:8080/rs_server/webservice/userService/user?id=1
@DELETE
@Path("/user")
@Consumes({ "application/xml" })
public void delUser(@QueryParam("id") int id);

// URL = http://localhost:8080/rs_server/webservice/userService/user
@PUT
@Path("/user")
@Consumes({ "application/xml", "application/json" })
public void updateUser(User user);

// URL = http://localhost:8080/rs_server/webservice/userService/user
@GET
@Path("/user")
@Produces({ "application/xml", "application/json" })
public List<User> findAllUsers();

// URL = http://localhost:8080/rs_server/webservice/userService/user/1
@GET
@Path("/user/{id}")
@Consumes({ "application/xml" })
@Produces({ "application/xml", "application/json" })
public User findUserByID(@PathParam("id") int id);
}
  • 创建接口实现类
 public class UserServiceImpl implements UserService {

     @Override
public void saveUser(User user) {
System.out.println("用户保存成功:" + user);
}

@Override
public void delUser(int id) {
System.out.println("ID为 " + id + " 的用户删除成功");
}

@Override
public void updateUser(User user) {
System.out.println("用户更新成功:" + user);
}

@Override
public List<User> findAllUsers() {
List<User> list = new ArrayList<>();
list.add(new User(1, "zhangsan", 11));
list.add(new User(2, "lisi", 22));
return list;
}

@Override
public User findUserByID(int id) {
return new User(1, "zhangsan", 11);
}
}
  • 在web.xml中增加以下配置
 <!-- 指定Spring框架配置文件的位置 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- 配置Spring框架的监听器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 配置CXF的Servlet -->
<servlet>
<servlet-name>cxf</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
</servlet>
<!--指定Servlet的访问路径 -->
<servlet-mapping>
<servlet-name>cxf</servlet-name>
<url-pattern>/webservice/*</url-pattern>
</servlet-mapping>
  • 配置applicationContext.xml
 <?xml version="1.0" encoding="UTF-8"?>

 <beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxrs="http://cxf.apache.org/jaxrs"
xmlns:soap="http://cxf.apache.org/bindings/soap"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd ">
<!-- 注册服务提供者 -->
<bean id="userServiceImpl" class="com.itheima.service.impl.UserServiceImpl"></bean>
<!--
发布Web服务
address : 请求地址
-->
<jaxrs:server address="/userService">
<jaxrs:serviceBeans>
<ref bean="userServiceImpl" />
</jaxrs:serviceBeans>
<!--
拦截请求信息,非必须
设置后,可以在控制台观察到请求信息
-->
<jaxrs:inInterceptors>
<bean class="org.apache.cxf.interceptor.LoggingInInterceptor"></bean>
</jaxrs:inInterceptors>
<!--
拦截响应信息,非必须
设置后,可以在控制台观察到响应信息
-->
<jaxrs:outInterceptors>
<bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"></bean>
</jaxrs:outInterceptors>
</jaxrs:server>
</beans>

3、使用CXF开发WebService客户端(JAX-RS)

  • 创建Maven工程,类型为JAR

  • 引入坐标
 <!-- cxf-rs的坐标 -->

 <dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxrs</artifactId>
<version>3.0.1</version>
</dependency>
<!-- cxf-rs客户端的坐标 -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-rs-client</artifactId>
<version>3.0.1</version>
</dependency>
<!-- 增强cxf-rs,可以处理json数据 -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-rs-extension-providers</artifactId>
<version>3.0.1</version>
</dependency>
<!-- 上面的依赖必须依赖此包 -->
<dependency>
<groupId>org.codehaus.jettison</groupId>
<artifactId>jettison</artifactId>
<version>1.3.7</version>
</dependency>
</dependencies>
  • 将Server工程的实体类拷贝过来

  • 示例测试代码

 public class CXFTest {
  ​// HTTP 405 Method Not Allowed : 请求方式错误,例如,服务端要求使用POST请求,客户端发起请求的时候,使用了PUT请求
  //保存
  ​@Test
  ​public void test1() {
    ​​WebClient// 服务器地址 : 端口号/项目名/
​​​​​        // web.xml中cxfServlet指定的地址/applicationContext.xml中指定的地址/类上Path指定的地址/方法上Path指定的地址
      ​​​​.create("http://localhost:8080/cxf_rs_server/webService/userService/user")// 指定请求的地址
    ​​​​  .post(new User(11, "张三", "123"));
  ​}
  //删除
  ​@Test
  ​public void test2() {
    ​​WebClient
      ​​​​.create("http://localhost:8080/cxf_rs_server/webService/userService/user")
​​​​      .query("id", 100).delete();
​  }   //更新
  ​@Test
  ​public void test3() {
    ​​WebClient
​​​​      .create("http://localhost:8080/cxf_rs_server/webService/userService/user")
​​​​      .put(new User(11, "张三", "123"));
​  } 
  
//查询所有
  ​@Test
  ​public void test4() {
    ​​Collection<? extends User> collection = WebClient
      ​​​​.create("http://localhost:8080/cxf_rs_server/webService/userService/user")
      ​​​​.getCollection(User.class);
    for (User user : collection) {
        ​​​System.out.println(user);
​​    }
​  }   //根据字段查询结果
​  @Test
​  public void test5() {
    ​​User user = WebClient
    ​​​​  .create("http://localhost:8080/cxf_rs_server/webService/userService/user")
​​​​      .query("id", 11).get(User.class);     ​​System.out.println(user);
  ​}   ​@Test
  ​public void test6() {
​​    User user = WebClient
      ​​​​.create("http://localhost:8080/cxf_rs_server/webService/userService/user/" + 22 + "/icon")
      ​​​​.get(User.class);     ​​System.out.println(user);
​  }

  ​@Test
  ​public void test7() {
    ​​WebClient
​​​​      .create("http://localhost:8080/cxf_rs_server/webService/userService/user")// 指定请求的地址
      ​​​​.type(MediaType.APPLICATION_JSON)// 指定本客户端传递给服务器的数据格式
      ​​​​.accept(MediaType.APPLICATION_JSON)//指定服务器传递回来的数据格式,本客户端能处理的数据格式
​​​​      .post(new User(11, "张三", "123"));
  ​}
}

4、RESTFul常用注解

4.1 路径相关

  • @Path : 设置访问路径. 可以用在方法或类上面

4.2 参数类型相关

  • @Consumers: 定义方法参数类型,常用值为 : "application/xml", "application/json"

  • @Producers: 定义方法返回值类型,常用值为 : "application/xml", "application/json"

4.3 参数相关

  • @QueryParam : 查询参数. 客户端传参:url?id=10

  • @PathParam : 路径参数. 客户端传参:url/10

4.4 操作类型相关

  • @GET: 查询操作

  • @POST: 添加操作

  • @DELETE : 删除操作

  • @PUT: 修改操作

Web Service与Apache CXF 框架的更多相关文章

  1. 怎样更好的设计你的REST API之基于REST架构的Web Service设计及REST框架实现

    一.REST 含状态传输(英文:Representational State Transfer,简称REST)是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格. 眼下在 ...

  2. JAVA开发Web Service几种框架介绍

    郑重声明:此文为转载来的,出处已不知了,侵告删. 在讲Web Service开发服务时,需要介绍一个目前开发Web Service的几个框架,分别为Axis,axis2,Xfire,CXF以及JWS( ...

  3. Web Service学习之二:Web Service(for JAVA)的几种框架

    在讲Web Service开发服务时,需要介绍一个目前开发Web Service的几个框架,分别为Axis,axis2,Xfire,CXF以及JWS(也就是前面所述的JAX-WS,这是Java6发布所 ...

  4. Web服务cxf框架发布2

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本人声明.否则将追究法律责任. 作者:永恒の_☆ 地址:http://blog.csdn.net/chenghui0317/ ...

  5. Web Service学习-CXF开发Web Service实例demo(一)

    Web Service是什么? Web Service不是框架.更甚至不是一种技术. 而是一种跨平台,跨语言的规范 Web Service解决什么问题: 为了解决不同平台,不同语言所编写的应用之间怎样 ...

  6. apache CXF Service 简单使用

    cxf介绍 框架官网:cxf.apache.org 支持多种协议: SOAP1.1,1.2 XML/HTTP CORBA(Common Object Request Broker Architectu ...

  7. JAX-RS 方式的 RESTful Web Service 开发

    JAX-RS 方式的 RESTful Web Service 开发 ——基于 CXF+Spring 的实现 Web Service 目前在风格上有两大类,一个是基于 SOAP 协议,一个是完全遵循 H ...

  8. Apache CXF入门

    CXF简介 Apache CXF = Celtix + XFire,开始叫 Apache CeltiXfire,后来更名为 Apache CXF 了.CXF 继承了 Celtix 和 XFire 两大 ...

  9. JAVAEE——BOS物流项目07:WebService入门、apache CXF入门、基于CXF发布CRM服务

    1 学习计划 1.WebService入门 n 什么是WebService n 调用网络上的WebService服务 n SOAP和WSDL概念 n 基于JDK1.7发布一个简单的WebService ...

随机推荐

  1. redhat linux elk命令

    安装es后不能启动原因在elasticsearch.yml中加如下两个配置: bootstrap.memory_lock: falsebootstrap.system_call_filter: fal ...

  2. Logstash配置总结和实例

    这里记录Logstash配置中注意的事项: 整个配置文件分为三部分:input,filter,output.参考这里的介绍 https://www.elastic.co/guide/en/logsta ...

  3. Creating a custom analyzer in ElasticSearch Nest client

     Creating a custom analyzer in ElasticSearch Nest client Question: Im very very new to elasticsearch ...

  4. Spring Boot Cookbook 中文笔记

    Spring Boot Cookbook 一.Spring Boot 入门 Spring Boot的自动配置.Command-line Runner RESTful by Spring Boot wi ...

  5. iOS学习笔记(6)——翻译苹果文档About Windows and Views

    About Windows and Views 关于窗口和视图 In iOS, you use windows and views to present your application’s cont ...

  6. 递归实现进制转换(C++版)

    上次呢,我们留下了一道题,今天我们来一起看一看: 题目链接:https://www.cnblogs.com/gaozirong/p/10547434.html 这是我写的程序,大家可以对照参考一下(C ...

  7. eNSP 模拟器添加loopback本地回环口

    eNSP只能模拟华为的设备,通常情况下数据通信的传递范围仅限于eNSP中的设备之间. 有时我们在学习更多技术,比如希望将eNSP跟VMware Workstation里的虚拟机互通,或者想让eNSP里 ...

  8. mysql中权限的小知识

    参考:https://www.cnblogs.com/apollo1616/articles/10294490.html mysql中user表中host列的值的意义 % 匹配所有主机 localho ...

  9. 关于莫比乌斯函数的塞 : 莫比乌斯前n项和 , 莫比乌斯函数绝对值的前n项和

    https://ac.nowcoder.com/acm/contest/874#submit/{%22problemIdFilter%22%3A25455%2C%22statusTypeFilter% ...

  10. 对于maven创建spark项目的pom.xml配置文件(图文详解)

    不多说,直接上干货! http://mvnrepository.com/ 这里,怎么创建,见 Spark编程环境搭建(基于Intellij IDEA的Ultimate版本)(包含Java和Scala版 ...