博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CXF之八 RESTFul服务
阅读量:5847 次
发布时间:2019-06-18

本文共 9991 字,大约阅读时间需要 33 分钟。

JAX-RS概述

JAX-RS是提供用于开发RESTful Web服务基于注解(annotation)的API。JAX-RS旨在定义一个统一的规范,使得Java程序员可以使用一套固定的接口来开发REST应用,避免了依赖第三方框架。同时JAX-RS使用POJO编程模型和基于注解的配置并集成JAXB,可以有效缩短REST应用的开发周期。JAX-RS只定义RESTful API,具体实现由第三方提供,如Jersey、Apache CXF等

JAX-RS包含近五十多个接口、注解和抽象类:

  • javax.ws.rs包含用于创建RESTful服务资源的高层次(High-level)接 口和注解。
  • javax.ws.rs.core包含用于创建RESTful服务资源的低层次(Low-level)接口和注解。
  • javax.ws.rs.ext包含用于扩展JAX-RS API支持类型的APIs。

JAX-RS常用注解:

  • @Path:标注资源类或方法的相对路径。
  • @GET、@PUT、@POST、@DELETE:标注方法的HTTP请求类型。
  • @Produces:标注返回的MIME媒体类型。
  • @Consumes:标注可接受请求的MIME媒体类型。
  • @PathParam、@QueryParam、@HeaderParam、@CookieParam、@MatrixParam、@FormParam:标注方法的参数来自于HTTP请求的位置。@PathParam来自于URL的路径,@QueryParam来自于URL的查询参数,@HeaderParam来自于HTTP请求的头信息,@CookieParam来自于HTTP请求的Cookie。

服务端

下面用CXF发布一个图书馆RESTFul服务,实现书籍的查询、添加、删除和修改。CXF发布RESTFul服务需要引入cxf-rt-frontend-jaxrs,pom.xml配置如下。

4.0.0
study
cxfrestful
0.0.1-SNAPSHOT
jar
cxfrestful
http://maven.apache.org
3.1.1
org.apache.cxf
cxf-rt-frontend-jaxrs
${cxf.version}
org.apache.cxf
cxf-rt-transports-http
${cxf.version}
org.apache.cxf
cxf-rt-transports-http-jetty
${cxf.version}

书籍XML格式

尼古拉·奥斯特洛夫斯基
10
钢铁是怎样炼成的?
3.0

书籍实体类

package com.study.cxfrestful.domain;import javax.xml.bind.annotation.XmlRootElement;/** * 书籍实体类 */@XmlRootElement(name = "Book")public class Book {    // id    private String id;    // 书名    private String name;    // 作者    private String author;    // 价格    private Double price;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getAuthor() {        return author;    }    public void setAuthor(String author) {        this.author = author;    }    public Double getPrice() {        return price;    }    public void setPrice(Double price) {        this.price = price;    }    public String getId() {        return id;    }    public void setId(String id) {        this.id = id;    }}

 

图书馆服务类

package com.study.cxfrestful.ws;import java.util.HashMap;import java.util.Map;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.MediaType;import javax.ws.rs.core.Response;import com.study.cxfrestful.domain.Book;/** * 图书馆服务 *  */@Path("/library")@Produces("text/xml")public class LibraryService {    private Map
books = new HashMap
(); public LibraryService() { init(); } /** * 获取 * * @param id * 索引 * @return 书 */ @GET @Path("/books/{id}/") public Book getBook(@PathParam("id") String id) { return books.get(id); } /** * 更新 * * @param book * @return */ @PUT @Path("/books/") public Response updateBook(Book book) { Response r; if (book == null) { r = Response.noContent().build(); return r; } String id = book.getId(); Book b = books.get(id); if (b != null) { books.put(id, book); r = Response.ok(true, MediaType.TEXT_PLAIN).build(); } else { r = Response.notModified().build(); } return r; } /** * 添加 * * @param book * @return */ @POST @Path("/books/") public Response addBook(Book book) { Response r; if (book == null) { r = Response.notModified().build(); } else { books.put(book.getId(), book); r = Response.ok(true, MediaType.TEXT_PLAIN).build(); } return r; } /** * 删除 * * @param book * @return */ @DELETE @Path("/books/{id}/") public Response deleteBook(@PathParam("id") String id) { Response r; Book book = books.get(id); if (book == null) { r = Response.notModified("id不存在").build(); } else { books.remove(id); r = Response.ok(book, MediaType.APPLICATION_XML).build(); } return r; } /** * 初始化,在图书馆里加几本书 */ private void init() { Book book = null; book = new Book(); book.setAuthor("CSDN"); book.setId("blog"); book.setName("如何使用博客"); book.setPrice(3.0); books.put(book.getId(), book); book = new Book(); book.setAuthor("CSDN"); book.setId("app"); book.setName("如何下载CSDN移动客户端"); book.setPrice(30.0); books.put(book.getId(), book); book = new Book(); book.setAuthor("CSDN"); book.setId("resource"); book.setName("如何下载CSDN资源"); book.setPrice(5.0); books.put(book.getId(), book); book = new Book(); book.setAuthor("CSDN"); book.setId("rs"); book.setName("JAX-RS详解"); book.setPrice(15.0); books.put(book.getId(), book); }}

 

客户端

查询书籍信息,在浏览器中输入 

这里写图片描述

下面用Fiddler模拟POST、DELETE和PUT请求。

添加书籍

鲁迅
11
朝花夕拾
20.0

这里写图片描述

添加返回结果

HTTP/1.1 200 OKDate: Fri, 31 Jul 2015 06:50:30 GMTContent-Type: text/plain Date: Fri, 31 Jul 2015 06:50:30 GMT Content-Length: 4 Server: Jetty(9.2.10.v20150310) true

修改书籍

鲁迅
11
朝花夕拾
200.0

这里写图片描述

返回结果

HTTP/1.1 200 OKDate: Fri, 31 Jul 2015 06:52:24 GMTContent-Type: text/plain Date: Fri, 31 Jul 2015 06:52:24 GMT Content-Length: 4 Server: Jetty(9.2.10.v20150310) true

删除书籍

这里写图片描述

返回结果

HTTP/1.1 200 OKDate: Fri, 31 Jul 2015 06:54:36 GMTContent-Type: application/xml Date: Fri, 31 Jul 2015 06:54:36 GMT Content-Length: 147 Server: Jetty(9.2.10.v20150310) 
鲁迅
11
朝花夕拾
200.0

Tomcat中发布RESTful

CXF在Tomcat中发布服务,需要-Web支持,pom.xml配置如下。

4.0.0
study
cxfrestful
0.0.1-SNAPSHOT
jar
cxfrestful
http://maven.apache.org
3.1.1
4.1.7.RELEASE
org.springframework
spring-aop
${spring.version}
org.springframework
spring-aspects
${spring.version}
org.springframework
spring-beans
${spring.version}
org.springframework
spring-context
${spring.version}
org.springframework
spring-core
${spring.version}
org.springframework
spring-web
${spring.version}
org.apache.cxf
cxf-rt-frontend-jaxrs
${cxf.version}
org.apache.cxf
cxf-rt-frontend-jaxrs
${cxf.version}
org.apache.cxf
cxf-rt-transports-http
${cxf.version}
org.apache.cxf
cxf-rt-transports-http-jetty
${cxf.version}

在web.xml中添加CXFServlet

cxfserver
contextConfigLocation
classpath:beans.xml
org.springframework.web.context.ContextLoaderListener
cxfservlet
org.apache.cxf.transport.servlet.CXFServlet
1
cxfservlet
/rest/*
index.html
index.jsp

在WEB-INF文件夹下创建cxf-servlet.xml

 

Spring上下文配置beans.xml

启动Tomcat,在浏览器中输入http://<地址>/cxfrestserver/rest即可看到服务 

这里写图片描述

 

你可能感兴趣的文章
我的友情链接
查看>>
oracle一些无聊的问题:;。.?/\|!@*
查看>>
点击图片上传文件
查看>>
PTP实现网络高精度
查看>>
python对文件的操作
查看>>
我的友情链接
查看>>
容器ArrayList原理(学习)
查看>>
JavaScript强化教程——JavaScript Math(算数) 对象
查看>>
IT菜鸟的生存指南(三)流行还是经典
查看>>
Python学习笔记__7.6章 使用原类
查看>>
文件I/O
查看>>
C#取硬盘、CPU、主板、网卡的序号 ManagementObjectSearcher
查看>>
Linux防火墙关闭及查看详解
查看>>
mysql主主同步模式
查看>>
Python基础班每日整理(五)
查看>>
php获取当前页面的完整url
查看>>
网络运维——访问共享的三种方式
查看>>
sql developer Oracle 数据库 用户对象下表及表结构的导入导出
查看>>
搭建DNS服务-----正向解析、反向解析、泛域名解析。
查看>>
详述在Linux上挂载window共享文件夹
查看>>