WebService之CXF的RestFul风格开发

CXF发布RSETful 风格WebService 

本文转载自:仰望星空_45

原文地址:http://blog.csdn.net/yangwangxlk/article/details/44776615

1、关于RestFul的介绍

简介

REST也就是Representational State Transfer。REST并不特指一种技术,也不是一个标准,它仅仅是一个构架风格。REST 指的是一组架构约束条件和原则。满足这些约束条件和原则通过网络暴露资源给用户。事实上,WWW就是经典的REST架构风格。在服务器端,应用程序状态和功能可以分为各种资源。它向客户端公开。每个资源都使用 URI (Universal Resource Identifier) 得到一个惟一的地址。所有资源都共享统一的界面,以便在客户端和服务器之间传输状态。使用的是标准的HTTP 方法,比如 GET、PUT、POST 和 DELETE。客户端通过交换各种资源的表现体来查询或更新资源。资源的表现体包括HTML,XML,JSON等。客户端需要解析响应服务器的表现体。客户端和服务器之间的交互在请求之间是无状态的,无状态请求可以由任何可用服务器应答。

下面是一些RESTfu例子,提供雇员和部门的信息,并介绍客户端怎样访问这些服务

URI for the RESTful service—http://<host>/department/deptname/employee:

•     GET—获得deptname部门的所有员工信息

•     POST—为deptname部门创建员工信息。

•     DELETE—删除 deptname部门一名员工信息

URI for the RESTful service—http://<host>/department/deptname/employee/naveen:

•     GET—获得deptname部门名叫naveen的员工信息

•     PUT—为deptname部门创建名叫naveen的员工信息

•     DELETE—删除deptname部门名叫naveen的员工信息

 

下面是POST请求的例子http://<host>/department/deptname/employee

 

 

POST /department/deptname/employee HTTP/1.1

Content-Type: */*

Accept: application/xml

User-Agent: Apache CXF 2.2.2

Cache-Control: no-cache

Pragma: no-cache

Host: 127.0.0.1:9001

<employee><firstname>rajeev</firstname><lastname>hathi</lastname>

<dob>10/26/78</dob></employee>

 

Java API for RESTful services

 

上一节,我们了解雇员POST请求。如果需要提供一种实现去识别雇员POST请求,我们应该做如下工作:

 

识别这是否一个HTTP POST请求。

将HTTP POST请求中的XML的内容转换为实现端所需要的格式,例如Java对象。

执行指定的操作,例如插入雇员信息到数据库

以HTTP形式响应客户端,例如设置标志响应成功的HTTP状态200 ,并将响应转换到指定格式(XML或JSON),最后将其设置到HTTP Body。

 

依据需求,可能你要实现所有的HTTP方法,如GET,PUT,DELETE等。这不就是标准的RESTful JAVA开发模式吗?接着,Java API for RESTful Web services (JAX-RS)规范制定了开发RESTful的标准。

 

JAX-RS规范定义了创建RESTful服务的语法。JAX-RS使用annotations注解在实现RESTful的服务,使用annotations注解POJO将它暴露为RESTful资源。RESTful服务类中,通过URI(/category)和HTTP(GET, POST)方法注解方法。

 

@GET

       @Path("/category/{id}")

       public Category getCategory(@PathParam("id") String id)

 

实现JAX-RS的框架在运行的时候,通过映射HTTP请求到RESTful方法,负责调用正确的JAVA实现方法。JAX-RS规范提供这种映射的方法的算法。基础算法包括,判断JAVA资源类,判断HTTP URI请求,判断内容格式(例如application/xml),还有HTTP方法(例如GET)

 

JAX-RS规范提出如下要点:

 

POJO依赖性

为了暴露为资源,使用annotations注解POJO,

 

HTTP依赖性

RESTful资源暴露在HTTP中,规范中将HTTP 协议和JAX-RS API相对应映射。

 

格式独立性

API中提供嵌入式的方法,标准化添加HTTP内容的类型。例如,application/xml就是HTTP内容的类型中的一种。

 

容器独立性

可以在任何一种容器中部署实现JAX-RS规范的应用程序。

 

在各个系统交互领域,Web services逐渐成为主流。有两种主要方式来开发Web Services:Simple Object Access Protocol (SOAP)和Representational State Transfer (REST)

 

开发基于SOAP的Web Services需要很多的约束, 以便客户端和服务端交互信息,例如,使用Web Service Description Language (WSDL)来描述信息。还有很多WS的标准如WS-Security。

 

使用REST构架的服务被称为RESTful服务。这种架构利用简单的XML在HTTP协议上,就像网页一样发送请求,简化了基于SOAP架构开发。RESTful Web Services尤其适用于只需要提交和接受简单的XML信息。

 

使用CXF开发RESTFul服务

接下来会介绍使用CXF框架来开发RESTful风格的Web Services。

 参考质料:http://cxf.apache.org/docs/restful-services.html

简介

Java API for RESTful services

CXF JAX-RS实现

开发RESTful服务

CXF JAX-RS实现

CXF实现了JAX-RS1.0规范,并提供了很多特性帮助开发者搭建企业级的RESTful服务。

下面是CXF框架提供创建RESTful服务的各种特性。

集成spring

Spring框架已经变成事实上的构建企业级JAVA应用程序集成框架。CXF提供与Spring整合,简化了配置和部署RESTful应用程序。Spring提供依赖注入促进松散耦合,提供各种服务,像声明式事务管理。所有这些Spring提供的特性都可以被开发RESTful服务的CXF框架使用。

 

插入式数据绑定

数据库绑定就是映射HTTP请求,例如JSON或XML,到对应的JAVA对象。同样的,在发送HTTP响应之前,服务端的JAVA实现需要映射为客户端所需要的格式。通过提供数据库绑定组件,CXF在后台透明的处理映射。CXF支持各种数据绑定机制,如JAXB,JSON,XMLBean和Aegis。CXF允许指定特定的绑定机制。

 

客户端API

JAX-RS规范并没有提供客户端调用REST服务的API。CXF提供了这种API直接调用RESTful服务,也可以使用Spring框架配置到应用程序中。

 

安全

CXF可以使用Spring框架集成的声明式安全组件,按照应用程序的需要限制资源类和方法,而不必使用代码处理安全性问题。

 

过滤器

过滤器用来预处理或后处理信息。CXF可以创建和配置过滤器来审核信息,记录信息的日志,还有基于应用要求修改请求或响应。

 

 

 

CXF也运行开发者使用JAX-WS Provider和Dispatch API来创建RESTful服务。

 

开发RESTful服务

 

本节将介绍使用JAX-RS实现的方法来开发RESTful服务,并执行CRUD操作。首先看一下Book Shop应用。

 

Book Shop应用是一款网络应用,提供技术书籍(JAVA或.NET)的分类。Book Shop让管理员为新的书籍创建分类,修改分类等。一旦这个分类存在,应用可以为这个分类添加新的书籍。

 

这个应用将提供如下方法:

创建分类

更新分类

删除分类

获取分类列表

获取特定分类

为特定分类添加书籍

获取特定分类中所有书籍

 

 

为了开发RESTful服务,需要做如下工作:

  1.  创建POJO类
  2. 为POJO类提供数据绑定
  3. 创建实现RESTful功能的服务类
  4. 创建调用RESTful服务的客户端

2、开始建立项目

新建一个web项目“RestFul”,将之前的apache的CXF项目下的lib里所有的jar包导入项目(为避免缺少包,因为我们只是用来学习而已)

1、创建POJO类

[java] view plain copy
 
  1. package com.xlk.restful.domain;  
  2.   
  3. import javax.xml.bind.annotation.XmlRootElement;  
  4. /** 
  5.  *  
  6.  * book实体类 </br>  
  7.  * 类名: Book </br>  
  8.  * 日期: 2014-2-25 下午02:07:52 </br>  
  9.  * @author 许立亢  
  10.  * @version 1.0 
  11.  */  
  12. @XmlRootElement(name = "Book")  
  13. public class Book {  
  14.   
  15.     private String bookId;  
  16.       
  17.     private String bookISBNnumber;  
  18.       
  19.     private String bookName;  
  20.       
  21.     //Let assume one author only  
  22.     private String author;  
[java] view plain copy
 
  1. //get set  方法  
[java] view plain copy
 
  1. }  

 

[java] view plain copy
 
  1. package com.xlk.restful.domain;  
  2.   
  3. import java.util.Collection;  
  4.   
  5. import javax.xml.bind.annotation.XmlRootElement;  
  6. /** 
  7.  *  
  8.  * Category实体类 </br>  
  9.  * 类名: Category </br>  
  10.  * 日期: 2014-2-25 下午02:08:35 </br>  
  11.  * @author 许立亢  
  12.  * @version 1.0 
  13.  */  
  14. @XmlRootElement(name = "Category")  
  15. public class Category {  
  16.   
  17.     private String categoryId;  
  18.   
  19.     private String categoryName;  
  20.   
  21.     private Collection<Book> books;  
  22.         //get set  方法  
  23.       
  24. }  

          一定要在类的前边加上annotation ,这样才能让这个person的信息在POJO和XML之间转换。

2、为POJO类提供数据绑定

为了提供RESTful服务端和客户端通信,POJO需要转换为特定的格式,例如XML或JSON。为了实现这部分功能,需要一个数据绑定的组件来映射JAVA对象和XML(或者指定的格式)。

 

CXF使用JAXB作为默认的数据绑定组件。JAXB使用注解来定义JAVA对象和XML之间映射的关系。

 

在POJO类Category中,注解@XmlRootElement指定Category为XML的根元素。Category类的属性默认指定映射为@XmlElement。@XmlElement用来定义XML中的子元素。@XmlRootElement和@XmlElement允许自定义命名空间和XML中元素的名称。如果没有定义的话,JAXB在运行的时候默认的使用同样的属性名和类名来定义XML元素。

 

        下面的XML请求表示了Category数据对象:

         

[xml] view plain copy
 
  1. <?xml version="1.0" encoding="UTF-8" standalone="yes"?>  
  2.    <Category>  
  3.       <books>  
  4.          <author>Naveen Balani</author>  
  5.          <bookISBNnumber>ISBNB001</bookISBNnumber>  
  6.          <bookId>NB001</bookId>  
  7.          <bookName>Fiction Book1</bookName>  
  8.       </books>  
  9.       <categoryId>005</categoryId>  
  10.       <categoryName>Fiction Series</categoryName>  
  11.    </Category>  

 

3、创建实现RESTful功能的服务类

类注

CategoryService的类声明上定义了@Path 和@Produces注解。@Path定义了URI路径,客户端可以通过这个路径访问到CategoryService对象。如@Path("/categoryservice"),那么URI请求,就可以是http://localhost:9000/categoryservice/。@Produces定义了服务类和方法生产内容的类型。如@Produces("application/xml"),那么CategoryService只会生产application/xml。 

方法注解

每个方法都和@Produces相关,它决定了这个方法生产什么样的响应。每个方法都有和HTTP方法映射的的注解,例如@GET 和@POST。方法中的@Path注解指定了该方法的URI。例如getCategory()方法上的@Path("/category/{id}"),可以使用http://localhost:9000/categoryservice/category/001,访问到category id 为001的分类。{id}就好比参数。接着,让我们看看@PathParam注解。@PathParam注解是用来给URI 路径一个模板变量,方法的输入参数。@PathParam("id") 就是URI中的@Path ("/category/{id}")。

 

@GET

       @Path("/category/{id}")

       public Category getCategory(@PathParam("id") String id)

 

[java] view plain copy
 
  1. package com.xlk.restful.service.impl;  
  2.   
  3. //JAX-RS Imports  
  4. import javax.ws.rs.Consumes;  
  5. import javax.ws.rs.DELETE;  
  6. import javax.ws.rs.GET;  
  7. import javax.ws.rs.POST;  
  8. import javax.ws.rs.PUT;  
  9. import javax.ws.rs.Path;  
  10. import javax.ws.rs.PathParam;  
  11. import javax.ws.rs.Produces;  
  12. import javax.ws.rs.WebApplicationException;  
  13. import javax.ws.rs.core.Response;  
  14. import javax.ws.rs.core.Response.ResponseBuilder;  
  15. import javax.ws.rs.core.Response.Status;  
  16.   
  17. import com.xlk.restful.dao.impl.CategoryDAO;  
  18. import com.xlk.restful.domain.Category;  
  19.   
  20. /** 
  21.  *  
  22.  * Category的restful服务端 </br>  
  23.  * 类名: CategoryService </br>  
  24.  * 日期: 2014-2-25 下午02:21:15 </br>  
  25.  * @author 许立亢  
  26.  * @version 1.0 
  27.  */  
  28. @Path("/categoryservice")  
  29. @Produces({"application/json","application/xml"})  
  30. public class CategoryService {  
  31.   
  32.     private CategoryDAO categoryDAO = new CategoryDAO();  
  33.   
  34.     public CategoryDAO getCategoryDAO() {  
  35.         return categoryDAO;  
  36.     }  
  37.   
  38.     public void setCategoryDAO(CategoryDAO categoryDAO) {  
  39.         this.categoryDAO = categoryDAO;  
  40.     }  
  41.   
  42.     @GET  
  43.     @Path("/category/{id}")  
  44.     @Produces({"application/json","application/xml"})  
  45.     public Category getCategory(@PathParam("id") String id) {  
  46.   
  47.         System.out.println("getCategory called with category id: " + id);  
  48.   
  49.         Category cat = (Category) getCategoryDAO().getCategory(id);  
  50.         if (cat == null) {  
  51.             ResponseBuilder builder = Response.status(Status.BAD_REQUEST);  
  52.             builder.type("application/xml");  
  53.             builder.entity("<error>Category Not Found</error>");  
  54.             throw new WebApplicationException(builder.build());  
  55.         } else {  
  56.             return cat;  
  57.         }  
  58.     }  
  59.   
  60.     @POST  
  61.     @Path("/category")  
  62.     @Consumes({"application/json","application/xml"})  
  63.     public Response addCategory(Category category) {  
  64.   
  65.         System.out.println("addCategory called");  
  66.   
  67.         Category cat = (Category) getCategoryDAO().getCategory(  
  68.                 category.getCategoryId());  
  69.   
  70.         if (cat != null) {  
  71.             return Response.status(Status.BAD_REQUEST).build();  
  72.         } else {  
  73.             getCategoryDAO().addCategory(category);  
  74.             return Response.ok(category).build();  
  75.         }  
  76.   
  77.     }  
  78.   
  79.     @DELETE  
  80.     @Path("/category/{id}")  
  81.     @Consumes({"application/json","application/xml"})  
  82.     public Response deleteCategory(@PathParam("id") String id) {  
  83.   
  84.         System.out.println("deleteCategory with category id : " + id);  
  85.   
  86.         Category cat = (Category) getCategoryDAO().getCategory(id);  
  87.         if (cat == null) {  
  88.             return Response.status(Status.BAD_REQUEST).build();  
  89.         } else {  
  90.             getCategoryDAO().deleteCategory(id);  
  91.             return Response.ok().build();  
  92.         }  
  93.     }  
  94.   
  95.     @PUT  
  96.     @Path("/category")  
  97.     @Consumes({"application/json","application/xml"})  
  98.     public Response updateCategory(Category category) {  
  99.   
  100.         System.out.println("updateCategory with category id : "  
  101.                 + category.getCategoryId());  
  102.   
  103.         Category cat = (Category) getCategoryDAO().getCategory(  
  104.                 category.getCategoryId());  
  105.         if (cat == null) {  
  106.             return Response.status(Status.BAD_REQUEST).build();  
  107.         } else {  
  108.             getCategoryDAO().updateCategory(category);  
  109.             return Response.ok(category).build();  
  110.         }  
  111.     }  
  112.   
  113.     @POST  
  114.     @Path("/category/book")  
  115.     @Consumes({"application/json","application/xml"})  
  116.     public Response addBooks(Category category) {  
  117.   
  118.         System.out.println("addBooks with category id : "  
  119.                 + category.getCategoryId());  
  120.   
  121.         Category cat = (Category) getCategoryDAO().getCategory(  
  122.                 category.getCategoryId());  
  123.         if (cat == null) {  
  124.             return Response.status(Status.NOT_FOUND).build();  
  125.         } else {  
  126.             getCategoryDAO().addBook(category);  
  127.             return Response.ok(category).build();  
  128.         }  
  129.     }  
  130.   
  131.     @GET  
  132.     @Path("/category/{id}/books")  
  133.     @Consumes("application/xml,application/json")  
  134.     public Response getBooks(@PathParam("id") String id) {  
  135.   
  136.         System.out.println("getBooks called with category id : " + id);  
  137.   
  138.         Category cat = (Category) getCategoryDAO().getCategory(id);  
  139.   
  140.         if (cat == null) {  
  141.             return Response.status(Status.NOT_FOUND).build();  
  142.         } else {  
  143.             cat.setBooks(getCategoryDAO().getBooks(id));  
  144.             return Response.ok(cat).build();  
  145.   
  146.         }  
  147.     }  
  148.   
  149. }  

 DAO

 

[java] view plain copy
 
  1. package com.xlk.restful.dao.impl;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.Collection;  
  5. import java.util.HashMap;  
  6. import java.util.Map;  
  7.   
  8. import com.xlk.restful.domain.Book;  
  9. import com.xlk.restful.domain.Category;  
  10.   
  11. /* 
  12.  * DataAcess object for performing CRUD operations. 
  13.  * Dummy implementation. 
  14.  */  
  15. public class CategoryDAO {  
  16.   
  17.     private static Map<String, Category> categoryMap = new HashMap<String, Category>();  
  18.     private static Map<String, Collection<Book>> bookMap = new HashMap<String, Collection<Book>>();  
  19.   
  20.     static {  
  21.   
  22.         Category category1 = new Category();  
  23.         category1.setCategoryId("001");  
  24.         category1.setCategoryName("Java");  
  25.         categoryMap.put(category1.getCategoryId(), category1);  
  26.   
  27.         Book book1 = new Book();  
  28.         book1.setAuthor("Naveen Balani");  
  29.         book1.setBookName("Spring Series");  
  30.         book1.setBookId("001");  
  31.         book1.setBookISBNnumber("ISB001");  
  32.   
  33.         Book book2 = new Book();  
  34.         book2.setAuthor("Rajeev Hathi");  
  35.         book2.setBookName("CXF Series");  
  36.         book2.setBookId("002");  
  37.         book2.setBookISBNnumber("ISB002");  
  38.   
  39.         Collection<Book> booksList = new ArrayList<Book>();  
  40.         booksList.add(book1);  
  41.         booksList.add(book2);  
  42.   
  43.         bookMap.put(category1.getCategoryId(), booksList);  
  44.     }  
  45.   
  46.     public void addCategory(Category category) {  
  47.         categoryMap.put(category.getCategoryId(), category);  
  48.   
  49.     }  
  50.   
  51.     public void addBook(Category category) {  
  52.         bookMap.put(category.getCategoryId(), category.getBooks());  
  53.   
  54.     }  
  55.   
  56.     public Collection<Book> getBooks(String categoryId) {  
  57.         return bookMap.get(categoryId);  
  58.   
  59.     }  
  60.   
  61.     public Category getCategory(String id) {  
  62.         Category cat = null;  
  63.         //Dummy implementation to return a new copy of category to   
  64.       //avoid getting overridden by service  
  65.         if(categoryMap.get(id) != null) {  
  66.         cat = new Category();  
  67.         cat.setCategoryId(categoryMap.get(id).getCategoryId());  
  68.         cat.setCategoryName(categoryMap.get(id).getCategoryName());  
  69.         }  
  70.         return cat;  
  71.     }  
  72.   
  73.     public void deleteCategory(String id) {  
  74.         categoryMap.remove(id);  
  75.         // Remove association of books  
  76.         bookMap.remove(id);  
  77.     }  
  78.   
  79.     public void updateCategory(Category category) {  
  80.         categoryMap.put(category.getCategoryId(), category);  
  81.   
  82.     }  
  83.   
  84. }  

 

 4、创建调用RESTful服务的客户端

JAX-RS并不提供调用RESTful服务客户端。CXF框架提供了两种方式来创建客户端,这两种都可以使用Spring配置。

 

代理API

代理API允许你使用RESTful服务的资源类和接口。代理类是客户端直接调用接口方法,使用户不需要手工创建HTTP请求。将RESTful服务类传递给org.apache.cxf.jaxrs.client.JAXRSClientFactory类。一旦代理类创建好了,你可以直接使用RESTful服务接口类的任何方法。

 

CategoryService store = JAXRSClientFactory.create("http://

localhost:9000", CategoryService.class);

//Makes remote call to Category RESTFul service

store.getBooks("001");

 

HTTP客户端

使用org.apache.cxf.jaxrs.client.WebClient调用RESTful服务。本例中采用HTTP客户端。

[java] view plain copy
 
  1. package com.xlk.restful.client;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.IOException;  
  5. import java.io.InputStreamReader;  
  6.   
  7. import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;  
  8.   
  9. import com.xlk.restful.domain.Category;  
  10. import com.xlk.restful.service.impl.CategoryService;  
  11.   
  12.   
  13. /** 
  14.  *  
  15.  * 启动restful服务 </br>  
  16.  * 类名: CategoryServerStart </br>  
  17.  * 日期: 2014-2-25 下午02:25:30 </br>  
  18.  * @author 许立亢  
  19.  * @version 1.0 
  20.  */  
  21. public class CategoryServerStart {  
  22.   
  23.     public static void main(String[] args) {  
  24.   
  25.         // Service instance  
  26.   
  27.         CategoryService categoryService = new CategoryService();  
  28.         JAXRSServerFactoryBean restServer = new JAXRSServerFactoryBean();  
  29.   
  30.   
  31.         restServer.setResourceClasses(Category.class);  
  32.   
  33.         restServer.setServiceBean(categoryService);  
  34.   
  35.         restServer.setAddress("http://localhost:9000/");  
  36.   
  37.         restServer.create();  
  38.   
  39.         BufferedReader br = new BufferedReader(new InputStreamReader(System.in));  
  40.   
  41.         try {  
  42.             br.readLine();  
  43.         } catch (IOException e) {  
  44.   
  45.         }  
  46.         System.out.println("Server Stopped");  
  47.         System.exit(0);  
  48.   
  49.     }  
  50.   
  51. }  

 

 

[java] view plain copy
 
  1. package com.xlk.restful.client;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.Collection;  
  5. import java.util.Iterator;  
  6.   
  7. import javax.ws.rs.core.Response;  
  8.   
  9. import org.apache.cxf.jaxrs.client.WebClient;  
  10.   
  11. import com.xlk.restful.domain.Book;  
  12. import com.xlk.restful.domain.Category;  
  13.   
  14. /** 
  15.  *  
  16.  * 使用restful风格测试 </br>  
  17.  * 类名: CategoryServiceRESTClient </br>  
  18.  * 日期: 2014-2-25 下午02:26:03 </br>  
  19.  * @author 许立亢  
  20.  * @version 1.0 
  21.  */  
  22. public class CategoryServiceRESTClient {  
  23.   
  24.     //Put some static value  
  25.     private static final String CATEGORY_URL = "http://localhost:9000/";  
  26.     private static final String CATEGORY_ID = "005";  
  27.     private static final String TYPE_XML = "application/xml";  
  28.     private static final String TYPE_JSON = "application/json";  
  29.   
  30.     public static void main(String[] args) {  
  31.   
  32. //        System.out.println("Format is " + args[0]);  
  33.   
  34.         testAddCategory(TYPE_XML);  
  35.         testUpdateCategory(TYPE_XML);  
  36.         testGetCategory(TYPE_XML);  
  37.         testAddBooksForCategory(TYPE_XML);  
  38.         testGetBooksForCategory(TYPE_XML);  
  39.         testDeleteCategory(TYPE_XML);  
  40.   
  41.         testAddCategory(TYPE_JSON);  
  42.         testUpdateCategory(TYPE_JSON);  
  43.         testGetCategory(TYPE_JSON);  
  44.         testAddBooksForCategory(TYPE_JSON);  
  45.         testGetBooksForCategory(TYPE_JSON);  
  46.         testDeleteCategory(TYPE_JSON);  
  47.   
  48.   
  49.   
  50.     }  
  51.      
  52.     private static void testAddCategory(final String format) {  
  53.   
  54.         System.out.println("testAddCategory called with format " + format);  
  55.         WebClient client = WebClient.create(CATEGORY_URL);  
  56.         client.path("/categoryservice/category").accept(  
  57.                 format).type(format);  
  58.         Category cat = new Category();  
  59.         cat.setCategoryId(CATEGORY_ID);  
  60.         cat.setCategoryName("Fiction");  
  61.         Category catResponse = client.post(cat, Category.class);  
  62.         System.out.println("Category Id retreived for format " + format + " is " + catResponse.getCategoryId());  
  63.         assertEquals(catResponse.getCategoryId(), CATEGORY_ID);  
  64.   
  65.   
  66.     }  
  67.   
  68.     private static void testUpdateCategory(final String format) {  
  69.   
  70.         System.out.println("testUpdateCategory called with format " + format);  
  71.         WebClient client = WebClient.create(CATEGORY_URL);  
  72.         client.path("/categoryservice/category").accept(  
  73.                 format).type(format);  
  74.         Category cat = new Category();  
  75.         cat.setCategoryId(CATEGORY_ID);  
  76.         cat.setCategoryName("Fiction Series");  
  77.         Response response = client.put(cat);  
  78.         System.out.println("Status retreived for update category for format " + format + " is " + response.getStatus());  
  79.         assertEquals("200", String.valueOf(response.getStatus()));  
  80.   
  81.   
  82.     }  
  83.   
  84.     private static void testGetCategory(final String format) {  
  85.   
  86.         System.out.println("testGetCategory called with format " + format);  
  87.         WebClient client = WebClient.create(CATEGORY_URL);  
  88.         Category category = client.path("/categoryservice/category/" + CATEGORY_ID).accept(  
  89.                 format).type(format).get(Category.class);  
  90.         System.out.println("Category details retreived from service with format " + format);  
  91.         System.out.println("Category Name " + category.getCategoryName());  
  92.         System.out.println("Category Id " + category.getCategoryId());  
  93.         assertEquals(CATEGORY_ID, category.getCategoryId());  
  94.   
  95.   
  96.     }  
  97.   
  98.     private static void testAddBooksForCategory(final String format) {  
  99.   
  100.         System.out.println("testAddBooksForCategory called with format " + format);  
  101.         WebClient client = WebClient.create(CATEGORY_URL);  
  102.         client.path("/categoryservice/category/book").type(format).  
  103.                 accept(format);  
  104.         Category cat = new Category();  
  105.         cat.setCategoryId(CATEGORY_ID);  
  106.         cat.setCategoryName("Fiction Series");  
  107.         Book book1 = new Book();  
  108.         book1.setAuthor("Naveen Balani");  
  109.         book1.setBookId("NB001");  
  110.         book1.setBookISBNnumber("ISBNB001");  
  111.         book1.setBookName("Fiction Book1");  
  112.   
  113.         Collection<Book> booksList = new ArrayList<Book>();  
  114.         booksList.add(book1);  
  115.         cat.setBooks(booksList);  
  116.         client.post(cat, Category.class);  
  117.   
  118.   
  119.   
  120.     }  
  121.   
  122.     private static void testGetBooksForCategory(final String format) {  
  123.   
  124.         System.out.println("testGetBooksForCategory called with format " + format);  
  125.         WebClient clientBook = WebClient.create(CATEGORY_URL);  
  126.         Category categoryBooks = clientBook.path(  
  127.                 "/categoryservice/category/" + CATEGORY_ID + "/books").type(format).accept(format).get(Category.class);  
  128.         System.out.println("Book details retreived from service with format " + format);  
  129.   
  130.         assertEquals(String.valueOf(categoryBooks.getBooks().size()), "1");  
  131.   
  132.         Iterator<Book> iterator = categoryBooks.getBooks().iterator();  
  133.         while (iterator.hasNext()) {  
  134.             Book book = iterator.next();  
  135.             System.out.println("Book Name " + book.getBookName());  
  136.             System.out.println("Book ISBN " + book.getBookISBNnumber());  
  137.             System.out.println("Book ID " + book.getBookId());  
  138.             System.out.println("Book Author " + book.getAuthor());  
  139.   
  140.         }  
  141.   
  142.   
  143.     }  
  144.   
  145.     private static void testDeleteCategory(final String format) {  
  146.   
  147.         System.out.println("testDeleteCategory called with format " + format);  
  148.         WebClient client = WebClient.create(CATEGORY_URL);  
  149.         client.path("/categoryservice/category/" + CATEGORY_ID).type(format).  
  150.                 accept(format);  
  151.         Response response = client.delete();  
  152.         System.out.println("Status retreived for delete category for format " + format + " is " + response.getStatus());  
  153.         assertEquals("200", String.valueOf(response.getStatus()));  
  154.   
  155.   
  156.     }  
  157.   
  158.     private static void assertEquals(String expected, String result) {  
  159.         if (!expected.equalsIgnoreCase(result)) {  
  160.             throw new RuntimeException("Expecte value " + expected + ", Got value" + result);  
  161.         }  
  162.     }  
  163. }   

 3、测试项目

执行CategoryServerStart类中main方法,启动项目,控制台显示如下:



 项目部署启动成功。

执行测试类,CategoryServiceRESTClient,会依次调用相应的接口



 

这样一个基于restful的风格CXF开发基本完成。

整体的项目部署构建如下



 

下一章,继续介绍 

Restful(二)Spring整合CXF,发布RSETful 风格WebService

posted @ 2017-02-23 16:44  不忘初心,逐梦前行  阅读(336)  评论(0)    收藏  举报