笔记:Jersey REST API 设计

时间:2022-06-26 02:13:09

REST 使用 HTTP 协议的通用方法作为统一接口的标准词汇,REST 服务所提供的方法信息都在 HTTP 方法里,每一种HTTP请求方法都可以从安全性和幂等性两方面考虑,这对正确理解HTTP请求方法和设计统一接口具有决定性的意义,安全性是指系统对接口的访问,不会使服务器端资源的状态发生改变;幂等性是指系统对同一REST接口的多次访问,得到的资源状态是相同的,以下是各个方法的安全性和幂等性要求:

方法名称

 

安全性

 

幂等性

 

说明

 

GET

 

Y

 

Y

 

GET 方法是只读的

 

PUT

 

N

 

Y

 

PUT 方法是一种写操作的HTTP请求,PUT方法是幂等性的,即多次插入或者更新同一份数据,如果每次提交到服务器端,都会为数据添加一个新的主键值,那么就不是幂等性的,因此需要使用POST 方法

 

DELETE

 

N

 

Y

 

DELETE 方法是幂等的,即多次删除同一份数据,在服务器端的改变相同,执行删除的方法其返回值可以定义为 void,无返回值的方法,返回的响应实体为空,HTTP状态码为204

 

POST

 

N

 

N

 

POST 方法是写操作的HTTP请求,RPC 的所有写操作均使用 POST 方法,REST 只使用 HTTP 的POST 方法增加资源

 

路径变量注解

@QueryParam 注解

查询条件决定了方法的作用域,查询参数组成了查询条件,使用@QueryParam注解来定义查询参数,使用示例如下:

接口描述

 

资源地址

 

分页查询列表数据

 

/demos?start=10&size=100

 

查询单项数据

 

/demos/demo?id=12

 

分页查询注解示例:

Public DemoList getBypaging(@QueryParam("start") final int start,@DefaultValue("100") @QueryParam("size") final int size){

// 查询代码

}

? ?

查询单项数据注解示例:

Public Demo getEntity(@QueryParam("id") final int id){

// 查询代码

}

? ?

注解@QueryParam 可以和注解@DefaultValue 一起使用,注解 @DefaultValue 的作用是预置一个默认值,当请求不包含参数时,使用该默认值

@PathParam参数

用来定义路径参数,每个参数对应一个子资源,使用示例如下:

接口描述

 

资源地址

 

基本路径参数

 

/demos/eric

 

带标点符号的资源路径

 

/demos/01,2012-12,2014

 

子资源变长的资源路径

 

/demos/d/e/m/o

/demos/q2/restful;program=java;type=web

 

@Path 注解来定义资源路径,需要一个value参数来解析资源路径,该参数除了使用静态定义的方式外,也可以使用动态变量的方式,其格式为:{参数名称:正则表达式}。

基本路径参数注解示例:

@GET

@Path("eric")

Public string get(){

// 查询代码

}

带标点符号的资源路径注解示例:

@GET

@Path("{from:[0-9]{2},[0-9]{4}}-{to:[0-9]{2},[0-9]{4}}")

Public string getByCondition(@PathParam("from") string fromString,@PathParam("to") string toString){

// 查询代码

}

路径区间(PathSegment)是对资源地址更灵活的支持,使资源类的一个方法可以支持更广泛的资源地址请求,例如,固定子资源和动态子资源两个部分,对于动态匹配变长的子资源地址,PathSegment 类型的参数结合正则表达式很容易处理,示例如下:

@GET

@Path("{p:.+}/m/{n:[a-zA-Z]+}")

Public string getByAddress(@PathParam("p") final List<PathSegment> p,@PathParam("n") final string n){

Final StringBuilder result = new StringBuilder();

for(final PathSegment path : p){

result.append(path.getPath()).append("-");

}

? ?

return result.toString();

}