REST

什么是REST

REST是RoyThomas Fielding在他2000年的博士论文中提出的, Fielding将他对互联网软件的架构原则,定名为REST,即Representational State Transfer(常见的翻译是“表现层状态转化”)的缩写。

REST结构风格约束

1.客户端-服务器端。即客户端发起请求,服务端响应或拒绝,如出错客户端处理异常。
2.无状态。通信会话状态由客户端维护,也就是在请求中添加必要的信息。若在服务器端维护,则必须保证会话在同一服务器上进行或建立供集群内服务器共同访问的会话存储。
3.缓存。为解决无状态带来的重复请求的影响,请求只在第一次接受是被执行,后续请求可使用已完成结果直接响应。
4.统一接口。程序的整体URI保持一种通用架构,接口可读性强。
5.分层系统。按层划分负责处理一类功能,通常可分为三层:
(1)应用层:负责返回JSON数据和其他业务逻辑
(2)服务层:为应用层提供服务支持。
(3)数据访问层:提供数据访问和存储的服务。
REST就是这一系列设计约束的集合,如果一个架构符合REST原则,就称它为RESTful架构。

RESTful API设计指南

1.URI中不出现动词原则。
2.合理的请求头。当服务端只能返回json格式数据,如客户端Accept字段要求返回application/xml,则视为不合理返回406错误
3.合理使用请求方法和状态码。
方法 语义
OPTIONS 用于获取资源支持的所有HTTP方法
HEAD 用于只获取请求某个资源返回的头信息
GET 用于从服务器获取某个资源的信息:1.完成请求后,返回状态码200 OK 2.完成请求后,需要返回被请求的资源详细信息
POST 用于创建新资源:1.创建完成后,返回状态码201 Created 2.完成请求后,需要返回被创建的资源详细信息
PUT 用于完整的替换资源或者创建指定身份的资源,比如创建id为123的某个资源:1.如果是创建了资源,则返回201 Created2.如果是替换了资源,则返回200 OK
PATCH 用于局部更新资源:1.完成请求后,返回状态码200 OK 2.完成请求后,需要返回被修改的资源详细信息
DELETE 用于删除某个资源,完成请求后返回状态码204 No Content
4.正确地使用REST
  • 使用“201 Created”响应时,应该带Location,指向新建资源的地址
  • 使用“405 Method Not Allowed”响应时,应该带有Allow头,告诉客户端
    对该资源有效的HTTP方法
5.不要做出错误的提示

当返回结果中包含错误原因,不应返回200作为状态码,避免客户端可能会缓存成功的HTTP请求

6.合理使用嵌套对象序列化,尽可能将关联信息内联起来
7.版本区分
  • 保存在URI中,如https://api.swagger.com/api/v2,极力推荐
  • 放在请求头中。比如GitHub的用法:“Accept:application/vnd.github.v3+json”
  • 自定义请求头。比如,“X-Api-Version:1”
8.URI失效和迁移

对失效的API,应该返回“404not found”或“410 gone”;对迁移的API,返回301重定向

9.信息过滤

URL通常最好越简短越好,对结果过滤、排序和搜索相关的功能都应该通过参数实现。

参数 含义
offset=0&limit=10 offset开始位置,limit返回数量
page=2&per_page=100 page第几页,per_page每页数量
sortby=name&order=asc sortby按照什么属性排序,order排序顺序
sort=age,desc 多个排序条件组合
10.速度限制

为了避免请求泛滥HTTP状态码429(too many requests),给API设置速度限制很重要。可参考GitHub返回头:

  • X-RateLimit-Limit:当前时间段允许的并发请求数。
  • X-RateLimit-Remaining:当前时间段保留的请求数。
  • X-RateLimit-Reset:当前时间段剩余的秒数。
11.并发控制

缺少并发控制的PUT和PATCH请求可能导致“更新丢失”。这个时候可以使用
Last-Modified和ETag头来实现条件请求。具体原则如下:

  • 客户端发起的请求如果没有包含If-Unmodified-Since或者If-Match头,就返回状态码“403 Forbidden”,在响应正文中解释为何返回该状态码
  • 客户端发起的请求所提供的If-Unmodified-Since或者If-Match头与服务器记录的实际修改时间或ETag值不匹配时,返回状态码“412 Precondition Failed”
  • 客户端发起的请求所提供的If-Unmodified-Since或者If-Match头与服务器记录的实际修改时间或ETag的历史值匹配,但资源已经被修改过时,返回状态码“409 Conflict”
  • 客户端发起的请求所提供的条件符合实际值,就更新资源,响应“200 OK”或者者“204 No Content”,并且包含更新过的Last-Modified和/或ETag头,同时包含Content-Location头,其值为更新后的资源URI
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,036评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,046评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,411评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,622评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,661评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,521评论 1 304
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,288评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,200评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,644评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,837评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,953评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,673评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,281评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,889评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,011评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,119评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,901评论 2 355

推荐阅读更多精彩内容

  • 一说到REST,我想大家的第一反应就是“啊,就是那种前后台通信方式。”但是在要求详细讲述它所提出的各个约束,以及如...
    时待吾阅读 3,426评论 0 19
  • REST接口设计规范 URI格式规范 URI(Uniform Resource Identifiers) 统一资源...
    零一间阅读 8,170评论 1 5
  • 由于第一次接触WebService,对于很多概念不太理解,尤其是看到各个OpenAPI的不同提供方式时,更加疑惑。...
    FrancisSoung阅读 9,380评论 0 62
  • 前言:如果你有更好的私藏文章,不凡分享出来,独乐乐不如众乐乐(⊙o⊙) 本文总结了 RESTful API 设计相...
    utopia84阅读 4,027评论 2 35
  • 明天是一个特殊的日子,一年一度的高考。转眼间,我已经离开高中两年了,感觉一切都像一场梦一样,毕业后我从来没有回过头...
    说吧_记忆阅读 431评论 0 6