1.简介
REST(Representational State Transfer), 表述性状态转移是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格.
REST只是一种概念、风格或者约束,是回归HTTP本身的建议.
REST,SOAP,XML-RPC是目前三种主流的Web服务实现方案。REST相比其他两种更加简洁。
2.REST特点
REST应用应该具备的五点约束:
a. 每个资源都应该有一个唯一的标识
b. 使用标准的方法来更改资源的状态
c. Request和Response的自描述
d. 资源多重表述
e. 无状态的服务
与RPC(Remote Procedure Call Protocol)的区别:
REST强调资源有唯一的URI;而RPC更加强调过程(动词),由统一的接口来调用它们。
REST回归HTTP最初的设计;RPC仅仅只是把HTTP作为传输协议来使用。
REST是由超文本驱动的;RPC是由方法驱动的。
REST强调HTTP通信的语义可见性,通过消息头和标准的HTTP方法来体现;RPC把语义封装在HTTP消息体中。
3.如何设计REST接口
a.用URL规划所有的资源
资源就是我们服务器能提供的一个服务和返回的结果数据。对于软件来说,资源就是一个API接口.
URL在REST设计中,是非常重要的,设计时需遵循一下准则:
.一个URI标识一个资源,但是一个资源可以被多个URI标识
.资源是有层次的,应该在URL中体现
.定义内部保留URL关键字
.编写URL说明文档
.URL中不出现动词(因为都是资源)
b.使用HTTP提供的基本方法来对资源进行操作
CRDU操作定义如下:
.POST (创建资源Create)
.GET (获取资源Retrieve)
.PUT (修改资源Update)
.DELETE (删除Delete)
4.资源内容协商
开发者在发送一个 REST API 请求的同时,根据应用场景,针对相同的资源,可能会期待不同的返回形式,如xml, json.
a.使用 URI 模式进行内容协商
优点: 内容直观,无须解析请求头部内容
缺点:同一资源使用多个URL,造成URL浪费
REST API 请求,要求返回 XML 格式数据:
GET https://www.mydomain.com/books/cpluscplus/xml
REST API 请求,要求返回 JSON 格式数据:
GET https://www.mydomain.com/books/cpluscplus/json
b.使用 URL 参数进行内容协商
优点: 内容直观,无须解析请求头部内容
缺点:过多的参数会导致 URL 的可读性变差,或者 URL 过长请求无法执行
REST API 请求,要求返回 XML 格式数据:
GET https://www.mydomain.com/books/cpluscplus?format=xml
REST API 请求,要求返回 JSON 格式数据:
GET https://www.mydomain.com/books/cpluscplus?format=json
c.使用 Accept 头进行内容协商
优点: 同一资源URL固定
缺点:需解析请求的头部内容
支持的 MIME(Multipurpose Internet Mail Extensions) 类型:
Accept: text/html;charset=UTF-8
支持的字符编码:
Accept-Charset: utf-8
支持的数据编码:
Accept-Encoding: gzip,deflate,sdch
支持的语言:
Accept-Language: en-US,en;q=0.8,zh-CN;q=0.6
5.正确的使用 HTTP 响应代码
代码 代码含义
200 请求成功,且服务器已创建了新的资源。
201 是否只显示处于警告状态的应用实例
301 重定向, 请求的网页已被永久移动到新位置。同时服务器自动将该请求者转到新位置。
302 重定向, 请求的网页临时移动到新位置。同时服务器自动转到不同的临时位置。
304 未修改,自从上次请求后,请求的网页未被修改过。服务器返回此响应时,不会返回网页内容。
400 错误请求, 服务器不理解请求的语法。
401 未授权, 请求要求进行身份验证。
403 已禁止, 服务器拒绝请求。
404 未找到, 服务器找不到请求的网页。
405 方法禁用, 禁用请求中所指定的方法。
406 不接受, 无法使用请求的内容特性来响应请求的网页。
408 请求超时, 服务器等候请求时超时。
410 已删除, 如果请求的资源已被永久删除
412 未满足前提条件, 服务器未满足请求者在请求中设置的其中一个前提条件。
415 不支持的媒体类型, 请求的格式不受请求页面的支持。
500 内部服务器错误。
6.浏览器请求缓存
当客户在短时间内,多次请求同一资源的时候,我们需要对请求进行缓存,以减少服务器的对数据的操作次数,提高服务器的效率。
client A ------> Get /first ------> 缓存(无) ------> 获取后台数据 ------> hellow world ------> 缓存(有) ------> client A
client B ------> Get /first ------> 缓存(有) ------> hellow world ------> 缓存(有) ------> client B
a.使用 HTTP 头中的Cache-Control进行缓存处理
无缓存(http 1.0只有此一种)
Cache-Control: no-cache
其他缓存定义, Cache-Control:
public 所有内容都将被缓存
private 内容只缓存到私有缓存中
no-cache 所有内容都不会被缓存
no-store 所有内容都不会被缓存到缓存或 Internet 临时文件中
must-revalidation/proxy-revalidation 如果缓存的内容失效,请求必须发送到服务器/代理以进行重新验证
max-age=xxx (xxx is numeric) 缓存的内容将在 xxx 秒后失效, 这个选项只在HTTP 1.1可用, 并如果和Last-Modified一起使用时, 优先级较高
b.使用 HTTP 头中的Expires进行缓存处理
通过“Expires”字段来指定内容过期时间(必须是GMT格式),在此时间前的请求都不会导致后台程序重新请求数据:
Expires: Thu, 01 Dec 1994 16:00:00 GMT
c.使用 HTTP 头中的Last-Modified/ETag进行缓存处理
当数据内容几小时或者几天都不会变时,使用http头或者内容都不合适,需要我们将返回根据服务器内容的最后修改时间 Last-Modified,或者根据服务器内容生成电子标签 ETag.
当用户再次请求数据时,就可以在 HTTP 请求中使用 If-Modified-Since 或者 If-None-Match 头信息,把上次请求得到的时间戳或者电子标签传给服务器。
Last-Modified: Fri, 12 May 2006 18:53:33 GMT
ETag: "50b1c1d4f775c61:df3"
当收到一个有条件请求的 HTTP 头的 REST 请求的时候.
我们的程序需要将收到的时间戳或者电子标签与当前内容作比较,就可以很容易的知道用户请求的数据内容在这段时间是否发生过修改.
并根据比较结果返回给用户最新内容,或者用 HTTP 响应码 304 告知用户,内容没有变化。
If-Modified-Since: Fri, 12 May 2006 18:53:33 GMT
If-None-Match: W/"50b1c1d4f775c61:df3"
d.HTTP 内容中的meta进行缓存处理
meta中定义的内容会覆盖 HTTP头中的定义,但是作用是一样的.
7.并行写处理
如果用户A/B同时获取了资源,然后都对资源做了修改。但是B晚于A提交修改,B的修改很可能会覆盖A的修改.
此时使用的解决方案是使用If-Not-Modified-Since/If-Match :
当用户发出修改请求时,在 HTTP 请求中使用 If-Not-Modified-Since 或者 If-Match 头信息, 把获取数据时得到的时间戳或者电子标签传给服务器.
我们的程序通过与服务器当前内容的比较,就可以知道,这个修改请求是否是针对当前内容提出的。
当服务器发现内容已经被其他用户修改过了,就不会执行修改请求,并返回 HTTP 响应码 412(未满足前提条件)给用户。
8.认证安全
HTTP 基本验证:
GET /index.html HTTP/1.0
Host: localhost
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
除此紫外还可以用表单验证,LTPA 验证,Open ID 验证等方式,来满足更多的企业安全要求
- PCB设计规则考量之初识
PCB的设计规则可以分布局与走线.布局里最简单的原则就是避免信号之间的干扰,有把模拟部分与数字部分分开,把开关电源与数字部分分开,把端去耦电容靠近端点,而且从端点出来的电容容值按从小到大摆放效果会好些 ...
- Android UI设计规则
Android UI技巧 1.1 不该做什么 l 不要照搬你在其他平台的UI设计,应该让用户使用感觉是在真正使用一个Android软件,在你的LOGO显示和平台总体观感之间做好平衡 l 不要过度使 ...
- Tcl与Design Compiler (七)——环境、设计规则和面积约束
本文属于原创手打(有参考文献),如果有错,欢迎留言更正:此外,转载请标明出处 http://www.cnblogs.com/IClearner/ ,作者:IC_learner 本文的主要内容是讲解( ...
- MySQL数据库一般设计规则
一.数据库设计 规则一之存储规则: 一般情况可以选择MyISAM存储引擎,如果需要事务支持必须使用InnoDB存储引擎. 注意:MyISAM存储引擎 B-tree索引有一个很大的限制:参与一个索引的所 ...
- 5 个关于 API 中日期和时间设计规则
规则 #1 使用ISO-8601格式作为你的日期格式 ISO 8601 解决了很多问题,包括: 自然排序 - 简单和优雅,免去多余的工作即可实现排序 时区偏移 - 代表用户的地点和时区在日益增长的全球 ...
- [转] 你应该知道的应用UI动态设计规则
转自 CocoaChina http://www.cocoachina.com/macdev/uiue/2014/0505/8315.html 你应该知道的应用UI动态设计规则 这篇文章中,我主要阐述 ...
- MySQL 优化、设计规则浅谈
当数据量大,数据库相应慢时都会针对数据库进行优化.这时都是要针对具体情况,具体业务需求进行优化的. 但是有些步骤和规则应该适合各种情况的.这里综合网上找的资料简单分析一下. 第一优化你的sql和索引: ...
- Java-面向对象三大特征、设计规则
1)封装: 1.1)类:封装的是对象的属性和行为 1.2)方法:封装的是具体的业务逻辑实现 1.3)访问控制修饰符:封装的是访问的权限 2)继承: 2.1)作用:代码的复用 2.2)父类/基类:共有的 ...
- AD10的PCB设计规则
PCB布线规则,布板需要注意的点很多,但是基本上注意到了下面的这此规则,LAYOUT PCB应该会比较好,不管是高速还是低频电路,都基本如此. 1. 一般规则 1.1 PCB板上预划分数字.模拟.DA ...
- Altium designer的PCB设计规则
PCB布线规则,布板需要注意的点很多,但是基本上注意到了下面的这此规则,LAYOUT PCB应该会比较好,不管是高速还是低频电路,都基本如此. 1. 一般规则 1.1 PCB板上预划分数字.模拟.DA ...
随机推荐
- ajax事件请求
首先,ajax是什么? ajax是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术. ajax是一种用于创建的快速动态网页的技术. 当async:true时,表示异步执行ajax代码:当as ...
- C#实现阿拉伯数字(小写金额)到大写中文(大写金额)的转换
/// <summary> /// 本类实现阿拉伯数字到大写中文的转换 /// 该类没有对非法数字进行判别,请事先自己判断数字是否合法 /// </summary& ...
- Android TextView属性大全
android:ems 设置TextView的宽度为N个字符的宽度. android:maxems 设置TextView的宽度为最长为N个字符的宽度.与ems同时使用时覆盖ems选项.android: ...
- Python后端开发要求
关于Python后端开发要求 一.对Python有兴趣,熟悉Python(标准库) 最好阅读过源码 了解Python的优化(熟悉pypy更佳) 二.至少至少一门语言(不说"精通") ...
- 第一份开发工作,边学边做android
我刚刚毕业,在培训学校学的Java web开发,虽然学的没有大学生那么丰富细致,没有他们理论基础扎实,但是这是我学习软件开发的唯一方式了. 从小学我学习就是倒数2.3等,所有人都认为我是个没法学习的孩 ...
- HTML5学习指导路线
HTML5是现在热门的技术,经过8年的艰苦努力,该标准规范终于制定完成,在这里为想要学习HTML5初级程序员详细划分一下学习内容和步骤,让大家清楚的知道HTML5需要学什么?能够快速掌握HTML5开发 ...
- 运行java web项目时报错:Several ports (8005, 8080, 8009) required
运行java web项目时报错:Several ports (8005, 8080, 8009) required 如下图 之所以报上面的错误是因为安装Tomcat的时候,已经把端口8005,8080 ...
- Java 将两个有序数组合成为一个有序数组
基本思路 1.如果其中一个数组的元素均大于另一个数组的元素,则可以直接组合,不用拆分. 即:其中一个数组的第一个元素大于或者小于另一个数组的最后一个元素 2.若不满足1中的情况,则表明数组需要拆分,拆 ...
- 实际应用中遇到TimedRotatingFileHandler不滚动的问题
需求: 程序每天晚上8点和10点定时运行,期望日志按日期记录 添加Handler部分代码如下: formatter = logging.Formatter("%(asctime)s %(fi ...
- npm常用命令整理
npm是一个NodeJS包管理跟分发工具,已经成为了非官方的发布node模块(包)的标准.它可以帮助我们解决代码部署上的一些问题,将开发者从繁琐的包管理工作中(版本.依赖等)解放出来,更加专注于功能上 ...