restful架构
1、概念
RESTful(Representational State Transfer)表现层状态转化,他省略了主语:资源。可以从3个方面来理解它:资源、表现层、转化。
2、资源
资源就是网络上的一个具体信息,如一段文本、一张图片、一首歌等。一种资源就可以对应一个URI。要获取这种资源,就要访问这个URI,所以URI成为了没个资源的地址或者独一无二的标识符。
在网上搜索资源,就是在调用没个资源的URI。
3、表现层
表现层,就是把资源呈现出来,如文本用.txt,图片用.jpg等等。URI只代表资源的实体,不代表资源的变现形式,所以在有些网址中见.html等是不严格的。资源的表现形式需要在HTTP请求头的Accept和Content-Type字段指定。
4、状态转化
访问网站的过程,就是客户端和服务器端互动的过程。如果客户端想要操作服务器,必须通过某种手段,让服务器端发生”状态转化”(State Transfer)。而这种转化是建立在表现层之上的,所以就是”表现层状态转化”。
5、总结restful
(1)每一个URI代表一种资源;
(2)客户端和服务器之间,传递这种资源的某种表现层;
(3)客户端通过四个HTTP动词,对服务器端资源进行操作,实现”表现层状态转化”。
6、注意
(1)URI中不能包含动词;
//XXXXXXXX
/posts/show/1 show为动词
(2)如果某些动作是HTTP动词表示不了的,你就应该把动作做成一种资源
//网上汇款,从账户1向账户2汇款500元
POST /transaction
(3)不能在URI中加入版本号
//XXXXXXXXXXXX
http://www.example.com/app/1.0/foo
7、restful api设计
(1)协议:https
(2)域名:
应该尽量将API部署在专用域名之下。
https://api.example.com
如果确定API很简单,不会有进一步扩展,可以考虑放在主域名下。
https://example.org/api/
(3)版本
应该将API的版本号放入URL。
https://api.example.com/v1/
(4)路径
又称”终点”(endpoint),表示API的具体网址。
(1)不能有动词,只能有名词
(2)所用的名词往往与数据库的表格名对应
(3)表名应该用复数
https://api.example.com/v1/animals
8、http动词
常用的HTTP动词有下面五个(括号里是对应的SQL命令)
GET(SELECT):从服务器取出资源(一项或多项)。 POST(CREATE):在服务器新建一个资源。 PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)。 PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)。 DELETE(DELETE):从服务器删除资源。
以及
HEAD:获取资源的元数据。
OPTIONS:获取信息,关于资源的哪些属性是客户端可以改变的。
//如下面的一些请求接口设计
app.get('/zoos',function(req,res){ })
9、过滤信息
如果记录数量很多,服务器不可能都将它们返回给用户。API应该提供参数,过滤返回结果。
?limit=10:指定返回记录的数量
?page=2&per_page=100:指定第几页,以及每页的记录数
//node后台获取req.query.page or req.query.limit
:name=tom node后台获取:req.params.name
10、返回的状态码
200 OK - [GET]:服务器成功返回用户请求的数据,该操作是幂等的(Idempotent)。
201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功。
202 Accepted - [*]:表示一个请求已经进入后台排队(异步任务)
204 NO CONTENT - [DELETE]:用户删除数据成功。
400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作,该操作是幂等的。
401 Unauthorized - [*]:表示用户没有权限(令牌、用户名、密码错误)。
403 Forbidden - [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的。
404 NOT FOUND - [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。
406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)。
410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的。
422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误。
500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。
还没有评论,来说两句吧...