【博客260】RESTFUL API--REpresentational State Transfer

内容: 记录一种API设计理论–RESTFUL

REST含义

REST是设计风格而不是标准。是指客户端和服务器的交互形式

RESTFUL API含义:

字面意义:RESTful API就是REST风格的API

实际概念:用http动作来操作URL资源

关键词:

     Resource:资源,即数据。
     Representational:某种表现形式,比如用JSON,XML,JPEG等;
     State Transfer:状态变化。通过HTTP动词实现。

调用关系:

RESTful API由后台也就是SERVER来提供前端来调用。前端调用API向后台发起HTTP请求,后台响应请求
将处理结果反馈给前端。也就是说RESTful 是典型的基于HTTP的协议。

设计原则与规范:

     1、资源。首先是弄清楚资源的概念。资源就是网络上的一个实体,一段文本,一张图片或者一首歌曲。
     资源总是要通过一种载体来反应它的内容。文本可以用TXT,也可以用HTML或者XML、图片可以用JPG
     格式或者PNG格式,JSON是现在最常用的资源表现形式。
    
    (注意:需要保证所有事物都可以被抽象为资源,且每一个资源都有唯一的资源标识,对资源的操作不会
      改变这些标识。)

    (注意:RESTFUL API基于http,所以安全性不高)

     2、统一接口。RESTful风格数据元操CRUD(create,read,update,delete)分别对应HTTP方法:
     GET用来获取资源;
     POST用来新建资源(也可以用于更新资源);
     PUT用来更新资源;
     DELETE用来删除资源;

     3、URI。可以用一个URI(统一资源定位符)指向资源,即每个URI都对应一个特定的资源。要获取此
     资源访问它的URI就可以,因此URI就成了每一个资源的地址或识别符。一般的,每个资源至少有一个
     URI与之对应,最典型的URI就是URL

     4、无状态。所谓无状态即所有的资源都可以URI定位,而且这个定位与其他资源无关,也不会因为其它
     资源的变化而变化。有状态和无状态的区别
	
	举例:
		个人查询驾照考试结果,那么是需要先输入账号密码登录,然后登录后再进入个人中心,找到成绩
		查询按钮,按下查询。这里的每一步都依赖上一步,上一步执行失败则无法进入下一步。


     5、最好将API的版本号放入URL
   
     6、URL中只能有名词而不能有动词,操作的表达是使用HTTP的动词GET,POST,PUT,DELETEL。
     URL只标识资源的地址,不包括操作

     7、如果记录数量很多,服务器不可能都将它们返回给用户。API应该提供参数,过滤返回结果。
     比如:
		
	 查询可以捎带以下参数:
	 
     过滤条件:?type=1&age=16	
	 排序:?sort=age,desc	 
	 分页:?limit=10&offset=3
	 ...

	 8、URL的层次设计最好不要嵌套太多层

	 9、常见开头:api和version
	
	    将api部署在专门的域名下,比如:http://api.example.com
        将api放在主域名下,比如:http://www.example.com/api/
        
        将api的版本号放在url中,比如:http://www.example.com/api/v1.0

RESTFUL API举例:

查询驾照成绩:GET:http://www.xxx.com/grade/id   

驾照成绩有误,工作人员进行修改:POST:http://www.xxx.com/grade/id

数据安全性和幂等性:

数据安全性:是否对服务器后台数据造成影响

幂等性:执行一次和执行N次对资源的修改效果是否一致

操作的数据安全和幂等性:

	    安全性	     幂等性
GET	      √      	   √
POST	  ×			   ×
PUT		  ×			   √
DELETE	  ×			   √

常见HTTP返回状态码:

HTTP状态码-响应
服务器向用户返回的状态码和提示信息,使用标准HTTP状态码。

200:服务器成功返回用户请求的数据(get),该操作是幂等的。()

201:新建或修改数据成功(post put path)(增、改)

204:删除数据成功(delete)()

400:语义有误,当前请求无法被服务器理解、请求参数有误

401:请求语法正确但是用户没有认证,无法进行当前操作。(无认证、无权限)

403(用户提供了认证参数,但是参数错误、权限不足)表示服务器拒绝请求,用户访问是被禁止的。

404:请求资源不存在

422(新建的用户的属性有遗漏、或格式错误)当创建一个对象时,发生一个验证错误。

500: 服务器发生错误,用户将无法判断发出的请求是否成功。

相应结果:

服务器向客户端返回的结果应符合规范,比如:

#返回查询对象列表
GET    http://www.XX.com/YY
#返回单个对象
GET    http://www.XX.com/YY/ZZ
#返回新生成的对象
POST   http://www.XX.com/YY
#返回一个空文档
DELETE http://www.XX.com/YY

与以往设计的对比:

RESTFUL API:

查询房间信息:GET http://XX.com/v1/room/id
删除房间信息:DELETE http://XX.com/v1/room/id
提交新房间信息:POST http://XX.com/v1/room/id

旧设计API:

查询房间信息:http://XX.com/check/room/id
删除房间信息:http://XX.com/room/delete/id
提交新房间信息:http://XX.com/room/id/method=post

对比:RESTFUL API非常规范也易于理解,而旧设计无统一规范,则非常的混乱

优点:


1.适合开放性高的API,提供一种统一的机制来规范API设计,使得API适用于各种各样的前端设备,
   REST符合这种需求。

2.行为和资源分离,更容易理解和管理

3.提出使用版本号(例如v1、v2),更加规范。