基于CXF webService(5)REST service

本文介绍如何使用CXF框架实现基于RESTful风格的Web服务,通过定义资源类和注解来处理HTTP请求,包括添加、获取、更新和删除操作。展示了通过Java方式实现的数据操作和消息处理映射类,以及启动服务端的方法。同时提供了客户端调用服务的示例,以及如何通过浏览器直接访问服务接口。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

利用webservice交互有SOAP和REST两种方式,SOAP是协议,REST不是协议,它是一个过程,利用HTTP协议对应的GET,POST,PUT,DELETE四种方法对应查、增、改、删中方式。REST比较松散,它用来对资源数据的传输,效率高,但是还是要根据实际情况选择SOAP还是REST方式。

对于REST,官网给出了三种方式,第一种java方式,第二种jaxws方式,第三种(已经淘汰),本例我是第一种方式,第二种方式官网的例子本人也测试过,很简洁,但是不是很好懂,资料上一般都选第一种方式基于jaxrs的。(官网太不详细:http://cxf.apache.org/docs/restful-services.html)

下面给出一个我实现了的例子来说明。

首先来看看我的项目结构:


我们把基础的类

Book.java和Category.java先展示如下:

package demo.restful;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="Book")
public class Book {
	private String bookId;
	private String bookISBNnumber;
	private String bookName;
	private String author;
	public String getBookId() {
		return bookId;
	}
	public void setBookId(String bookId) {
		this.bookId = bookId;
	}
	public String getBookISBNnumber() {
		return bookISBNnumber;
	}
	public void setBookISBNnumber(String bookISBNnumber) {
		this.bookISBNnumber = bookISBNnumber;
	}
	public String getBookName() {
		return bookName;
	}
	public void setBookName(String bookName) {
		this.bookName = bookName;
	}
	public String getAuthor() {
		return author;
	}
	public void setAuthor(String author) {
		this.author = author;
	}
	

}

package demo.restful;

import java.util.Collection;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="Category")
public class Category {
	private String categoryId;
	private String categoryName;
	private Collection<Book> books;
	public String getCategoryId() {
		return categoryId;
	}
	public void setCategoryId(String categoryId) {
		this.categoryId = categoryId;
	}
	public String getCategoryName() {
		return categoryName;
	}
	public void setCategoryName(String categoryName) {
		this.categoryName = categoryName;
	}
	public Collection<Book> getBooks() {
		return books;
	}
	public void setBooks(Collection<Book> books) {
		this.books = books;
	}
	
	

}

数据操作的Dao类

package demo.restful;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

import org.springframework.stereotype.Repository;

@Repository
public class CategoryDAO {

	private static Map<String,Category> categoryMap= new HashMap<String,Category>();
	private static Map<String,Collection<Book>> bookMap = new HashMap<String, Collection<Book>>();
	static{
		Category category1 = new Category();
		category1.setCategoryId("001");
		category1.setCategoryName("Java");
		categoryMap.put(category1.getCategoryId(), category1);
		
		Book book1 = new Book();
		book1.setAuthor("Tian jun");
		book1.setBookName("Spring MVC");
		book1.setBookId("001");
		book1.setBookISBNnumber("isbn001");
		
		Book book2 = new Book();
		book2.setAuthor("t jun123");
		book2.setBookName("CXF WEB SERvice");
		book2.setBookId("002");
		book2.setBookISBNnumber("isbn002");
		
		Collection<Book> bookList = new ArrayList<Book>();
		bookList.add(book1);
		bookList.add(book2);
		
		bookMap.put(category1.getCategoryId(), bookList);
		
	}
	
	public  void addCategory(Category category){
		categoryMap.put(category.getCategoryId(), category);
	}
	
	public void addBook(Category category){
		bookMap.put(category.getCategoryId(), category.getBooks());
	}
	
	public Collection<Book> getBooks(String categoryId) {
		return bookMap.get(categoryId);
	}
	
	public Category getCategory(String id){
		Category cat =null;
		
		if(categoryMap.get(id)!=null){
			cat = new Category();
			cat.setCategoryId(categoryMap.get(id).getCategoryId());
			cat.setCategoryName(categoryMap.get(id).getCategoryName());
		}
		return cat ;
	}
	
	public void deleteCategory(String id){
		categoryMap.remove(id);
		bookMap.remove(id);
	}
	
	public void updateCategory(Category category){
		categoryMap.put(category.getCategoryId(), category);
	}
}

业务逻辑类,也是进行消息处理的映射类

package demo.restful;


import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
@Path("/categoryservice")
@Produces("application/xml")
public class CategoryService {
	
	@Autowired
	private CategoryDAO categoryDAO;
	
	public CategoryDAO getCategoryDao() {
		return categoryDAO;
	}

	public void setCategoryDao(CategoryDAO categoryDao) {
		this.categoryDAO = categoryDao;
	}

	@GET
	@Path("/category/{id}")
	public Category getCategory(@PathParam("id") String id){
		System.out.println("getcategory called with category id:"+id);
		Category cat = getCategoryDao().getCategory(id);
		return cat;
	}
	
	@POST
	@Path("/category")
	@Consumes("application/xml")
	public  void addCategory(Category category){
		System.out.println("addcategory called");
		Category cat = getCategoryDao().getCategory(category.getCategoryId());
		if(cat != null){
//			return Response.status(Status.BAD_REQUEST).build();
			getCategoryDao().addCategory(category);
		}
//		else{
			getCategoryDao().addCategory(category);
//			return Response.ok(category).build();
//		}
		
	}

	@DELETE
	@Path("/catagory/{id}")
	public void deleteCategory(@PathParam("id") String id){
		System.out.println("deleteCategory with category id:"+id);
		getCategoryDao().deleteCategory(id);
	}
	
	@PUT
	@Path("/category")
	public void updateCategory(Category category){
		System.out.println("updateCategory with id:"+category.getCategoryId());
		getCategoryDao().updateCategory(category);
	}
	
	
	@POST
	@Path("/category/book")
	@Consumes("application/xml")
	public void addBooks(Category category){
		System.out.println("addBook with category id:"+category.getCategoryId());
		Category cat = getCategoryDao().getCategory(category.getCategoryId());
		getCategoryDao().addBook(category);
	}
	
	@GET
	@Path("/category/{id}/books")
	@Consumes("application/xml")
	public Category getBooks(@PathParam("id") String id){
		System.out.println("getBooks called with id:"+id);
		Category cat = getCategoryDao().getCategory(id);
		cat.setBooks(getCategoryDao().getBooks(id));
		return cat;
	}
}

最后启动服务端:

</pre><pre name="code" class="java">package demo.restful;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
import org.apache.cxf.jaxrs.lifecycle.ResourceProvider;
import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class CategoryServiceStart {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("==============");
		ClassPathXmlApplicationContext appcontext = new ClassPathXmlApplicationContext(new String[]{"restapp.xml"});
		CategoryService categoryservice = (CategoryService) appcontext.getBean("categoryService");
		JAXRSServerFactoryBean restServer = new JAXRSServerFactoryBean();
		restServer.setResourceClasses(Category.class);
		restServer.setServiceBean(categoryservice);
		restServer.setAddress("http://localhost:9000/");
		restServer.create();
		
//		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//		try{
//			br.readLine();
//		}catch (IOException e){
//			e.printStackTrace();
//		}
//		System.out.println("*************$$$$$$$$**********************");
		
//		List<Class<?>> resourceClassList = new ArrayList<Class<?>>();
//		resourceClassList.add(CategoryService.class);
//		
//		List<ResourceProvider> resourceProviderList= new ArrayList<ResourceProvider>();
//		resourceProviderList.add(new SingletonResourceProvider(new CategoryService()));
//		
//		List<Object> providerList = new ArrayList<Object>();
//		providerList.add(new jackson);
//		
//		JAXRSServerFactoryBean factory = new JAXRSServerFactoryBean();
//		factory.setAddress("http://localhost:8080/WS/rest");
//		factory.setResourceClasses(resourceClassList);
//		factory.setResourceProviders(resourceProviderList);
//		factory.setProvider(providerList);
//		factory.create();
		
		System.out.println("rest ws is publish....");
		
		
	}

}

可以直接在浏览器中输入如下:

http://localhost:9000/categoryservice/category/001

看到如下:

<Category>
<categoryId>001</categoryId>
<categoryName>Java</categoryName>
</Category>

浏览器中输入:

http://localhost:9000/categoryservice/category/001/books

看到如下:

<Category>
<books>
<author>Tian jun</author>
<bookISBNnumber>isbn001</bookISBNnumber>
<bookId>001</bookId>
<bookName>Spring MVC</bookName>
</books>
<books>
<author>t jun123</author>
<bookISBNnumber>isbn002</bookISBNnumber>
<bookId>002</bookId>
<bookName>CXF WEB SERvice</bookName>
</books>
<categoryId>001</categoryId>
<categoryName>Java</categoryName>
</Category>

当然我们也可以编写客户端来实现:

代码如下:

package demo.restful.client;


import java.util.Iterator;

import javax.ws.rs.core.MediaType;

import org.apache.cxf.jaxrs.client.WebClient;

import demo.restful.Book;
import demo.restful.Category;

public class CategoryServiceClient {
	public static void main(String[] args) {
		WebClient client = WebClient.create("http://localhost:9000/");
		Category category = client.path("categoryservice/category/001").accept("application/xml").get(Category.class);
		System.out.println("category details from RESTful service...");
		System.out.println("category Name "+category.getCategoryName());
		System.out.println("category id "+category.getCategoryId());
		
		
		
		System.out.println("Book details for categroy "+category.getCategoryId()+" from REST service");
		String bookString ="categoryservice/category/"+category.getCategoryId()+"/books";
		
		
		WebClient clientBook = WebClient.create("http://localhost:9000/");
		try{
			
			Category categorybooks = clientBook.path(bookString).accept("application/xml").get(Category.class);
			
			Iterator<Book> iterator = categorybooks.getBooks().iterator();
			while(iterator.hasNext()){
				Book book = iterator.next();
				System.out.println("book name:"+book.getBookName());
				System.out.println("book isbn:"+book.getBookISBNnumber());
				System.out.println("book id:"+book.getBookId());
				System.out.println("book author:"+book.getAuthor());
			}		
			
		}catch(Exception e){
			e.printStackTrace();
		}
		
	}

}
效果如下:

如图大家看到的是编写Application发布实现的,由于我们是web,所以想利用Spring发布到服务器上。

资料和网上的都是利用jaxrs:server属性来实现的,我用的CXF是最新的3.1.1的版本,写上jaxrs:server属性,不提示错,但是编译的时候会爆没这个属性,官网信息太零散了,我还没找到最新版本的spring发布方式,有知道的可以告诉一声或交流下,不剩感激……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值