一、解读REST
REST翻译为表述性状态转移,源自某个博士发表的一篇论文。REST具有跨平台、跨语言的优势。从诞生开始,就得到了许多语言的快速支持,JAVA也不甘示弱。
REST不是一种技术、也不是一个标准或者协议而是一种架构风格,在这种风格中,对象被视为一种资源,通常使用概念清晰的名词命名。
二、REST与JAVA
JAX-RS是java领域的REST风格的Web服务的标准规范,是JAVA完成REST服务的基本约定。JSR339 名为The Java API for RESTful Web Service 既 JAX-RS2.0, 其参考实现是Glassfish项目中的Jersey2.0
Java领域的其他实现
- Jboss的RESTEasy
- Apache的CXF
没有遵循JAX-RS规范的REST风格的项目
- Restlet
- Rest.li
- Springmvc
三、REST与JSON
完全没有关系,有人一提到REST,就想到只要返回的数据是JSON格式,那就是REST API。不对,HTTP+URI+XML是REST的基本实现形式。
四、REST API设计
REST使用HTTP协议的通用方法作为统一接口的标准,REST服务所提供的方法信息都在HTTP的方法里。
每一种HTTP请求方法都可以从 安全性 和 幂等性 两个方面考虑。要定义严谨的REST接口,就需要正确理解HTTP方法的安全性和幂等性
安全性:外系统对接口的访问,不会是服务器的资源状态发生变化。
幂等性:外系统对同一REST接口的多次访问,得到的资源状态是相同的。
常用的HTTP方法:
- GET:安全性和幂等性, 读取一个数据应该设计成GET请求,因为读取一个资源,无论你多少次请求,得到的数据总是一样的,遵循幂等性,读取资源不会对其他状态做改动,遵循安全性。
举个例子,读取一个A资源时,要和B资源进行对比,如果不同,要同步A资源到B资源,从表面看是读取操作,但是有可能对资源进行修改,不具有安全性, 所以不应该设计成GET请求。 - PUT:幂等性,不安全性。用于更新数据,多次更新同一个资源。对资源状态的改变是相同的。所以遵循幂等性。更新资源应该设计成PUT请求
- DELETE:幂等性,删除一个资源,多次删除, 服务器产生相同的变化。 其返回中可以定义为 void 因为删除以前对改资源已经充分了解,没有必要再将其从服务器上传递回来,HTTP状态码应为 204
- POST:不幂等、也不安全。REST风格应该使用POST请求添加资源。
资源命名和资源定位
应该使用名词的单数或者复数作为资源的名称,一旦使用动词,资源从一个主语变成了宾语。从面像资源的角度上看,已经不再是面向资源,而是面向动作了。
REST使用URI实现资源定位,对外提供的REST服务就是公布一系列URI及其参数,资源地址是用来表达逻辑上的层次结构的, 可以从整体到局部,也可以是从一般到具体,使用 “/” 来分隔逻辑上的层次结构。
资源地址应该是全小写字母或者数字,多个单词使用“-”分隔。
参考资料:
Java RESTful Web Service 实战(第二版)韩陆著