REST风格架构
一说到rest 大家都耳熟能详,很多人的第一反应就是其是前后端请求后台的一种通信方式,甚至有些人将REST 和RPC 混为一谈,认为两者都是基于HTTP类似的东西。实际上很少人能叙述REST 所提出的各个约束,风格特点以及如何开始搭建REST服务。
什么是REST
REST(REpresentation State Transfer 表述性状态转移) 描述了一个架构样式的网络系统,他首次出现在Roy Fileding 的博士论文中, 他对此给出了REST API 应该具备的条件:
- REST API 不应该依赖于任何通信协议,尽管是要成功映射到某个协议可能会依赖元数据的可用性,所选的方法等。
- REST API 不应该包含对通信协议的任何改动,除非是补充或确定标准协议中未规定的部分。
- REST API 应该将大部分的描述工作放在定义用于表示资源和驱动应用的媒体类型上,或定义现有标准媒体类型的扩展关系名和(或)支持超文本的标记。
- REST API 绝不应该定义一个固定的资源名或者层次结构(客户端和服务器之间的明显耦合)
- REST API 永远也不应该有那些会影响客户端的“类型化”资源。
- REST API 不应该要求有先验知识,除了初始URI风格和适合目标用户的一组标准化媒体类型。
REST 并非标准,而是一种开发Web应用的架构风格,可以将其理解为一种设计模式。REST 基于HTTP,URI 以及XML 这些 现有的广泛流行的协议和标准,伴随着REST 的应用,HTTP 协议得到了更加正确的使用。
REST有哪些特征
REST指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是REST 。
1. 通过URI来标识资源:系统中的每一个对象都或资源都可以通过一个唯一的URI来进行寻址。URI的结构应该简单,可预测且易于理解,比如定义目录结构式的URI。
2. 统一接口:CRUD操作与HTTP方法之间的一对一映射。比如:
若要在服务器上创建资源应该用 POST 方法
若要检索某个资源应该用 GET 方法
若要更新或添加资源应该用 PUT 方法
若要删除某个资源应该用 DELETE 方法
3. 多重资源表述:URI 所访问的每个资源都可以使用不同的形式加以表示(比如XML 或者JSON)具体的表现形式取决于访问资源的客户端。客户端与服务提供者使用一种协商的机制(请求头与MIME类型)来选择合适的数据格式,最小化彼此之间的数据耦合。
4. 无状态: 对服务器端的请求应该是无状态的,完整,独立的请求不要求服务器在处理请求时检索任何类型的应用程序上下文或状态。
REST API 最佳实践
- 使用名词而不是动词
使用名词来定义接口:
/resources
/resources/1024
不应该使用动词:
/getAllresources
/creatNewResources
/deleteAllresources GET 方法查询参数不能改变资源状态
GET /users/111?activave
或
GET /users/111/activate使用名词复数
不要混淆名词的单复数。保持简单,只用复数名词来定义所有资源。
/cars 代替 /car
/users 代替 /user
…….使用子资源来表达资源间的关系
GET / cars /111/drivers 返回111号car的所有driver 列表
GET /cars /111/drivers/4 返回111号car 的4号列表使用HTTP header 来序列化格式
客户端,服务端都需要知道 相互之间通信的格式。这些格式可以定义在HTTP header 里面。
Content - Type 定义了请求格式。
Accept 定义了接收相应的格式列表使用HATEOAS 约束
HATEOAS 是REST架构风格中最复杂的约束,也是构建成熟REST 服务的核心,它的重要性在与打破了客户端和服务器之间的严格的契约,使客户端可以更加智能和自适应,而REST 服务本身的演化和更新也变得更加容易。提供过滤,排序,字段选择,分页
API 版本化:
版本号使用简单的序号,并避免点符号,如1.5 等等, 正确应该为 /blog/api/v1充分使用HTTP 状态码来处理错误。
REST风格架构的更多相关文章
- REST 风格架构
------------------------------ 时间不多了, 抓紧做一些有意义的事情 REST 风格架构 1. 他是面向资源进行开发的 2. 他是基于HTTP 协议进行开发 ...
- 使用REST风格架构您需要知道的一些事
1. REST的由来 2. REST的构成 2.1. 资源 2.2. 资源的表述 2.2.1. MIME(Multipurpose Internet Mail Extensions) 2.2.2. 缓 ...
- 向架构师进军-->可重用架构资源
如果你对项目管理.系统架构有兴趣,请加微信订阅号"softjg",加入这个PM.架构师的大家庭 软件架构有三个主要来源:拿取.方法以及直觉.拿取也就是可重用资源.对于一个标准的系统 ...
- Rest风格WEB服务(Rest Style Web Service)的真相
http://blog.csdn.net/jia20003/article/details/8365585 Rest风格WEB服务(Rest Style Web Service)的真相 分类: J2E ...
- SpringMVC+Json构建基于Restful风格的应用(转)
一.spring 版本:spring-framework-3.2.7.RELEASE 二.所需其它Jar包: 三.主要代码: web.xml <?xml version="1.0&qu ...
- [我所理解的REST] 3.基于网络应用的架构
上篇中解释到什么是架构风格和应该以怎样的视角来理解REST(Web的架构风格).本篇来介绍一组自洽的术语,用它来描述和解释软件架构:以及列举下对于基于网络的应用来说,哪些点是需要我们重点关注的. 1 ...
- [解读REST] 3.基于网络应用的架构
链接上文[解读REST] 2.REST用来干什么的?,上文中解释到什么是架构风格和应该以怎样的视角来理解REST(Web的架构风格).本篇来介绍一组自洽的术语,用它来描述和解释软件架构:以及列举下对于 ...
- NLayerAppV3--.net Core2实现的DDD分层架构
虽然每天的工作都是CURD.还是使用着传统的三层架构.使用着.net Framework,但是这并不能影响我学习DDD和.net core. 总是希望软件在应对复杂多变的场景时能够游刃有余,在解决问题 ...
- asp.net core系列 64 结合eShopOnWeb全面认识领域模型架构
一.项目分析 在上篇中介绍了什么是"干净架构",DDD符合了这种干净架构的特点,重点描述了DDD架构遵循的依赖倒置原则,使软件达到了低藕合.eShopOnWeb项目是学习DDD领域 ...
随机推荐
- ThinkPHP 数据库操作(四) : 聚合查询、时间查询、高级查询
聚合查询 在应用中我们经常会用到一些统计数据,例如当前所有(或者满足某些条件)的用户数.所有用户的最大积分.用户的平均成绩等等,ThinkPHP为这些统计操作提供了一系列的内置方法,包括: 用法示例: ...
- Pycharm使用教程(三)(非常详细,非常实用)
1. 汉化:把resources_zh.jar拷贝到PyCharm的安装目录下的lib目录,重启Pycharm即可. (resources_zh.jar汉化包关注本账号获取:链接: https://p ...
- java基础(一)-----java的三大特性之封装
面向对象编程有三大特性:封装.继承.多态.本文将介绍java的三大特性之封装 封装 封装从字面上来理解就是包装的意思,专业点就是信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成 ...
- 在 Vue 结合 Axios 使用过程 中 post 方法,后台无法接受到数据问题
关于在 vue 中 使用 axios 相关 bug 首先,我们来看下 axios 的 github 传送门 axios 然后我们再介绍下 axios 的作者的 github 传送门 Matt 最后,我 ...
- 分享一个很通用c语言的Makefile
编写Makefile是一个苦乐交织的事情,快乐是因为从一堆需要手工逐个处理的编译过程,进步到一条命令完成,看着代码顺畅的在屏幕上滚动,编译为最终的产品,那个过程无比愉悦:而痛苦则是,写代码已经很累了, ...
- Jvm垃圾回收器(基础篇)
一:概述 在这篇文章中<Jvm运行时数据区>介绍了Java内存运行时区域的各个部分,其中程序计数器.虚拟机栈.本地方法栈,3个区域随着线程的生存而生存的.内存分配和回收都是确定的.随着线程 ...
- 【Java基础】【22IO(其他流)&Properties】
22.01_IO流(序列流)(了解) 1.什么是序列流 序列流可以把多个字节输入流整合成一个, 从序列流中读取数据时, 将从被整合的第一个流开始读, 读完一个之后继续读第二个, 以此类推. 2.使用方 ...
- Flask入门之完整项目搭建
一.创建虚拟环境 1,新建虚拟环境 cmd中输入:mkvirtualenv 环境名 2,在虚拟环境安装项目运行所需要的基本模块 pip install flask==0.12.4 pip instal ...
- 【Parallel】.Net 并行执行程序的使用心得
一.摘要 官方介绍:提供对并行循环和区域的支持. 命名空间:using System.Threading.Tasks 三个静态方法:Parallel.Invoke,Parallel.For,Paral ...
- 阿里巴巴(alibaba)系列_druid 数据库连接池_监控(一篇搞定)记录执行慢的sql语句
参考帖子:http://www.cnblogs.com/han-1034683568/p/6730869.html Druid数据连接池简介 Druid是Java语言中最好的数据库连接池.Druid能 ...