1. Restful架构与实战(笔记)

Restful的本质

一种基于资源的软件架构风格

核心

面向资源设计API

解决的问题

  • 降低开发的复杂性
  • 提供系统的可伸缩性
    只需设计一套相同的后端处理接口,就可以为不同类型的终端(PC、Mobile等)提供服务。

设计概念和准则

  • 网络上的所有事物都可以被抽象为资源;
  • 每一个资源都有唯一的资源标识,对资源的操作不会改变这些标识;
  • 所有的操作都是无状态的(每次操作都是独立的,互不关联)

资源

网络上的一个实体,或网络上的一个具体信息(文字、图片、视频、音频等)。

Restful API

从定义上来说,Restful与http协议无关,但Restful API是基于http协议的一种实现,所有相关知识都是基于现有http协议而来,并没有对http协议进行扩充。

http协议-url

http是一个属于应用层的协议,特点是简捷、快速。

一个完整的url组成形式:
schema://host[:port]/path[?query-string][#anchor]

  • ==scheme== 指定底层使用的协议(例如:http,https,ftp)
  • ==host== 服务器的IP地址或域名
  • ==port== 服务器端口,默认为80;https的默认端口是443
  • ==path== 访问资源的路径(标识主机中的所有资源)
  • ==query-string== 发送给http服务器的数据(查询字符串,一般用于对资源做筛选操作)
  • ==anchor== 锚(直接滚动到当前页面的某个区域)

http协议-请求

组成格式:请求行、消息报头、请求报文

请求行
格式如下:Method Request-URL HTTP-Version CRLF

  • Method :请求方法
  • Request-URL :请求地址
  • HTTP-Version :http协议版本号
  • CRLF :回车换行

举例
GET / HTTP/1.1 CRLF (请求主机根目录下资源的请求头)
请求成功,则返回资源内容。

请求方法

  • ==GET== 请求获取Request-URL所标识的资源;(获取资源)
  • ==POST== 在Request-URL所标识的资源后附加新的数据;(发送数据)
  • ==HEAD== 请求获取由Request-URL所标识的资源的响应消息报头;
  • ==PUT== 请求服务器存储一个资源,并用Request-URL作为其标识;(更新资源时使用)
  • ==DELETE== 请求服务器删除Request-URL所标识的资源;
  • ==OPTIONS== 请求查询服务器的性能,或者查询与资源相关的选项和需求;(访问频率限制参数)

http协议-响应

组成格式:状态行、消息报头、响应正文

状态行
HTTP-Version Status-Code Reason-Phrase CRLF

  • HTTP-Version :http协议版本号
  • Status-Code :响应状态码
  • Reason-Phrase :字面的响应内容
  • CRLF:回车换行

例如:HTTP /1.1 200 OK

常用状态码

  • 200 OK //客户端请求成功 (客户端请求成功,且服务端响应成功)
  • 400 Bad Request //客户端请求有语法错误,不能被服务器所理解
  • 401 Unauthorized //服务器收到请求,但是拒绝提供服务(请求的资源需要授权访问,但客户端并未授权)
  • 404 Not Found //请求资源不存在
    一般来说,以5开头的状态码都是服务器内部错误
  • 500 Internal Server Error //服务器发生不可预期的错误(服务器程序错误)
  • 503 Server Unavailable //服务器当前不能处理客户端的请求(服务器性能达到瓶颈时,拒绝后续服务)

Restful架构与其他架构的区别(了解)

SOAP WebService
WebService 跨编程语言和跨操作系统平台的远程调用技术。
略...

如何设计Restful API(Restful设计要素)

  • 资源路径(URI):设计资源路径;
  • HTTP动词:即请求方式;
  • 过滤信息:获取资源列表时的分页操作,或普通的查询操作都要用到过滤信息,此时要合理分配过滤信息,避免过滤信息过多,违反Restful规定;
  • 状态码:服务端在客户端发送请求后,其应返回的响应状态码;
  • 错误处理:服务端在发现客户端传入的参数错误时,应该返回的信息;
  • 返回结果:POST操作后,需要返回资源实例;GET资源列表时,需要返回资源数组。

资源路径

在Restful架构中,每个网址代表一种资源,所以网址中不能有动词,只能有名词。一般来说API中的名词应该是复数。

API的版本号问题:

  • 处理方式1:将API的版本号加入到资源的地址中。
  • 处理方式2:将API的版本号加入到HTTP请求头中。

HTTP动词

对资源的操作(CURD),由HTTP动词(谓词)表示。

  • GET :从服务器取出资源(一项或多项)。
  • POST :在服务器新建一个资源。
  • PUT :在服务器更新资源(客户端提供改变后的完整资源)。(返回整个资源的信息)
  • DELETE :从服务器删除资源。
  • PATCH :在服务器更新资源(客户端提供改变的属性)。(只返回更新的属性)

过滤信息

如果记录数很多,服务器不可能将它们都返回给用户。
筛选操作前,API应该提供参数,过滤返回的结果。

状态码

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

  • 200 OK 服务器成功返回用户请求的资源,该操作是幂等的。

  • 204 NO CONTENT 删除数据成功(无响应体)。

  • 400 Bad Request 用户发出的请求有错误,该操作是幂等的。

  • 401 Unauthorized 表示用户没有认证,无法进行当前操作(用户未提供认证选项或参数)。

  • 403 Forbidden 表示用户访问是被禁止的。(用户提供了认证参数,但可能认证参数错误,或无权限)。

  • 422 Unprocesable Entity 当创建一个对象时,发生一个验证错误(验证信息不全)。

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

错误处理

配合HTTP状态码。如果状态码是4XXX 或 5XXX,就应该向用户返回出错信息,信息如下。一般来说,返回的信息中将error作为键名,出错信息作为键值即可。

{
"error":"参数错误" 
}

返回结果

针对不同操作,服务器向用户返回的结果应该符合以下规范:

  • GET/collections:返回资源对象的列表(数组)
  • GET/collections/identity:返回单个资源对象
    如果资源不存在,返回404状态码;
  • POST/collections:返回新生成的资源对象(返回新创建的资源的全部属性)
  • PUT/collections/identity:返回完整的资源对象(返回被更新资源的完整属性)
  • PATCH/collections/identity:返回被修改的属性
  • DELETE/collections/identity:返回一个空文档
    删除了资源,要返回204状态码。

identity 是指读取资源时传入的标识符

[常见的state code](http://www.cnblogs.com/shanyou/archive/2012/05/06/2486134.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,596评论 18 139
  • API定义规范 本规范设计基于如下使用场景: 请求频率不是非常高:如果产品的使用周期内请求频率非常高,建议使用双通...
    有涯逐无涯阅读 2,517评论 0 6
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,863评论 6 13
  • 一说到REST,我想大家的第一反应就是“啊,就是那种前后台通信方式。”但是在要求详细讲述它所提出的各个约束,以及如...
    时待吾阅读 3,408评论 0 19
  • 人活着,就会有落寞;前行,就会有坎坷;动心,就会有情伤。话再漂亮,说不到心上,也是枉然;情意再浓,不懂珍惜,也是徒...
    8900655f254d阅读 851评论 0 0