笔记:Jersey REST API 设计

  • REST 统一接口

    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 方法增加资源

  • 资源地址设计

    资源地址的设计对整个REST式的Web服务至关重要,涉及系统的可用性、可维护性和可扩展性等诸多方面的表现,资源地址的路径变量是用来表达逻辑上的层次结构的,资源和子资源的形式是自左至右、斜杠分割的名词,一个典型的URI包括协议名称、主机名称、服务端口、资源地址和查询字符串等组成,URI 组成如下:

    http://localhost:8080/rest-demo/webapi/demos/demo?id=1

    其中 rest-demo 表示 ContextPath(上下文路径)通常和部署服务器的配置或者REST服务的web.xml配置有关;webapi 表示 ServletPath 是 Servlet 名称,与 REST 服务中定义的 @ApplicationPath 注解或者web.xml 的配置有关;demos/demo 为资源地址,与资源类、子类以及类中的方法定义的@Path注解有关。需要注意的是,资源地址并不能唯一定位一个资源,只有资源地址和HTTP方法才能唯一定位资源。

    在路径变量里可以使用标点符合以辅助增强逻辑清晰性,作为资源地址的查询变量,用来表达算法的输入,实现对方法的作用域的约束,标点符号说明如下:

    • 问号(?)是用来分割资源地址和查询字符串的,与符号(&)是用来分割查询条件的参数, 示例代码如下:

      GET /demos?start=0&size=10

    • 逗号(,)是用来分割有次序的作用域信息,这种顺序可以是约定俗成的,比如先经度后纬度等,示例代码如下:

      GET /demos/01,2002-12,2014

      这段代码表示查询2002年1月到2014年12月的数据,这个例子中还是用了连字符(-)

    • 分号(;)是用来分割无序的作用域信息,通常这些信息是逻辑上并列存在的,示例代码如下:

      GET /demos/name;program=java;type=web

  • 路径变量注解
  • @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();

}

对于查询参数动态给定的场景,可以定义PathSegment作为参数类型,通过 getMatrixParameters方法获取 MultivaluedMap 类型的查询参数信息,示例代码如下:

@Path("q2/{condition}")

@GET

public String get(@PathParam("condition") final PathSegment condition) {

StringBuilder stringBuilder = new StringBuilder();

final MultivaluedMap<String, String> map = condition.getMatrixParameters();

final Iterator<Map.Entry<String, List<String>>> iterator = map.entrySet().iterator();

while (iterator.hasNext()) {

Map.Entry<String, List<String>> entry = iterator.next();

stringBuilder.append(entry.getKey()).append("=");

stringBuilder.append(entry.getValue()).append(" ");

}

?
?

return stringBuilder.toString();

}

上例是通过编程的方式调用PathSegment类的getMatrixParameters()方法来查询获取参数信息,还可以通过@MatrixParam注解来逐一定义参数,示例代码如下:

@Path("q3/{condition}")

@GET

public String get(@MatrixParam("program") String program, @MatrixParam("type") String type) {

StringBuilder stringBuilder = new StringBuilder();

stringBuilder.append("program="+program).append("&type=").append(type);

return stringBuilder.toString();

}

  • @FormParam 注解

    该注解用于定义表单参数,相应的REST方法用以处理请求实体媒体类型为 Content-Type:application/x-www-form-urlencoded的请求,示例代码如下:

    @Path("create")

    @POST

    @Produces(MediaType.APPLICATION_JSON)

    public DemoResult create(@FormParam("name") String name, @FormParam("sex") String sex) {

    DemoResult result = new DemoResult();

    result.setHasError(false);

    result.setMessage("创建 name=" + name + "\tsex=" + sex);

    return result;

    }

    默认情况下,会对表单参数进行自动解码,也可以使用@Encoded注解来禁用自动解码

  • @BeanParam 注解

    该注解用于自定义参数组合,使REST方法可以使用简洁的参数形式完成复杂的接口设计,示例代码如下:

    • 自定义参数类:

      public class CreateParam {

      @FormParam("name")

      private String name;

      ?
      ?

      @FormParam("sex")

      private String sex;

      ?
      ?

      // getter 和 setter 方法

      }

    • REST服务方法:

      @Path("createparam")

      @POST

      public DemoResult createByBeanPraam(@BeanParam CreateParam createParam) {

      DemoResult result = new DemoResult();

      result.setHasError(false);

      result.setMessage("创建 name=" + name + "\tsex=" + sex);

      return result;

      }

  • @CookieParam 注解

    该注解用以匹配Cookie中的键值对Cookie中的键值对信息,示例代码如下:

    @Path("createbycookie")

    @POST

    public DemoResult createByCookie(@FormParam("name") String name, @FormParam("sex") String sex,

    @CookieParam("dir") String bir) {

    DemoResult result = new DemoResult();

    result.setHasError(false);

    result.setMessage("创建 name=" + name + "\tsex=" + sex + "\tcookie=" + bir);

    return result;

    }

  • @Context 注解

    该注解来解析上下文参数,REST服务中,有多种元素可以通过@Context注解作为上下文参数使用,示例代码如下:

    @Path("context")

    @GET

    public String get(@Context Application application, @Context Request request,

    @Context Providers provider, @Context UriInfo uriInfo,

    @Context HttpHeaders httpHeaders) {

    ?

    }

    ?
    ?

    ?
    ?

时间: 2024-10-11 14:26:48

笔记:Jersey REST API 设计的相关文章

HTML5项目笔记4:使用Audio API设计绚丽的HTML5音乐播放器

HTML5 有两个很炫的元素,就是Audio和 Video,可以用他们在页面上创建音频播放器和视频播放器,制作一些效果很不错的应用. 无论是视屏还是音频,都是一个容器文件,包含了一些音频轨道,视频轨道和一些元数据,这些是和你的视频或者音频控件绑定到一块的,这样才形成了一个完整的播放组件. 浏览器支持情况: 浏览器 支持情况 编解码器 Chrome 3.0 Theora . Vorbis .Ogg H.264 . AAC .MPEG4 FireFox 3.5 Theora . Vorbis .Og

Django开发笔记之数据库的设计

后台采用Django开发,可以体会到开发的便利之处,对于一个项目来说,首先最重要的是数据库的设计,那么在Django下数据库设计主要是如下步骤: 1,需求分析,这点子不用多说,而我也深刻体会到了没有原型的时候就开始开发的困难之处,每次需求更改就会带来后台的数据和对应接口的一次变更.费时费精力 2.有了需求,那么开始数据库的设计,在Django中,并不需要直接去操作数据库,而且使用继承modesl.Model的类,在类中定义自己的模型,然后使用Python manage.py syncdb就可看到

RESTful API 设计指南(转)

网络应用程序,分为前端和后端两个部分.当前的发展趋势,就是前端设备层出不穷(手机.平板.桌面电脑.其他专用设备......). 因此,必须有一种统一的机制,方便不同的前端设备与后端进行通信.这导致API构架的流行,甚至出现"API First"的设计思想.RESTful API是目前比较成熟的一套互联网应用程序的API设计理论.我以前写过一篇<理解RESTful架构>,探讨如何理解这个概念. 今天,我将介绍RESTful API的设计细节,探讨如何设计一套合理.好用的API

RESTful API 设计指南

RESTful API 设计指南 本人来源于:http://www.ruanyifeng.com/blog/2014/05/restful_api.html 作者: 阮一峰 日期: 2014年5月22日 网络应用程序,分为前端和后端两个部分.当前的发展趋势,就是前端设备层出不穷(手机.平板.桌面电脑.其他专用设备......). 因此,必须有一种统一的机制,方便不同的前端设备与后端进行通信.这导致API构架的流行,甚至出现"API First"的设计思想.RESTful API是目前比

SoC嵌入式软件架构设计之六 :API设计方法

在嵌入式系统中,驱动都是以API的方式提供给应用进行调用.这里介绍嵌入式系统的API设计和管理方法. 驱动在系统中会按模块进行分类,例如按键驱动.LCD驱动.文件系统.card驱动.I2C驱动等等:每个模块又有多个接口,例如LCD驱动有光标定位.画点.画直线等,而文件系统有fread.fwrite.fseek.fopen等接口.以下举例将以文件系统的fopen为例,工具链为mips. 一.API设计方法 1. 驱动接口声明:extern FILE * fopen(const char * pat

Linux程序设计学习笔记----网络通信编程API及其示例应用

转载请注明出处, http://blog.csdn.net/suool/article/details/38702855. BSD Socket 网络通信编程 BSD TCP 通信编程流程 图为面向连接的Socket通信的双方执行函数流程.使用TCP协议的通信双方实现数据通信的基本流程如下 建立连接的步骤 1.首先服务器端需要以下工作: (1)调用socket()函数,建立Socket对象,指定通信协议. (2)调用bind()函数,将创建的Socket对象与当前主机的某一个IP地址和TCP端口

【转载】RESTful API 设计指南

作者: 阮一峰 日期: 2014年5月22日 网络应用程序,分为前端和后端两个部分.当前的发展趋势,就是前端设备层出不穷(手机.平板.桌面电脑.其他专用设备......). 因此,必须有一种统一的机制,方便不同的前端设备与后端进行通信.这导致API构架的流行,甚至出现"API First"的设计思想.RESTful API是目前比较成熟的一套互联网应用程序的API设计理论.我以前写过一篇<理解RESTful架构>,探讨如何理解这个概念. 今天,我将介绍RESTful API

JavaScript API 设计原则

网+线下沙龙 | 移动APP模式创新:给你一个做APP的理由>> 好的 API 设计:在自描述的同时,达到抽象的目标. 设计良好的 API ,开发者可以快速上手,没必要经常抱着手册和文档,也没必要频繁光顾技术支持社区. 流畅的接口 方法链:流畅易读,更易理解 //常见的 API 调用方式:改变一些颜色,添加事件监听 var elem = document.getElementById("foobar"); elem.style.background = "red&

Atitit.&#160;二进制数据ascii表示法,与base64编码解码api&#160;设计标准化总结java&#160;php&#160;c#.net

Atitit. 二进制数据ascii表示法,与base64编码解码api 设计标准化总结java php c#.net 1. Base64编码,1 1.1. 子模式 urlsafe Or  url unsafe2 1.2. 其他的二进制数据表示法  bin2hex() ,Quoted-printable ,UUencode2 2. Base64常用api2 2.1. ------------解码api2 2.2. decode(String s, OutputStream out)2 2.3.