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领域 ...
随机推荐
- Qt之QComboBox定制
说起下拉框,想必大家都比较熟悉,在我们注册一些网站的时候,会出现大量的地区数据供我们选择,这个时候出现的就是下拉框列表,再比如字体选择的时候也是使用的下拉框,如图1所示.下拉框到处可见,作为一个图形库 ...
- asp.net core系列 37 WebAPI 使用OpenAPI (swagger)中间件
一.概述 在使用Web API时,对于开发人员来说,了解其各种方法可能是一项挑战.在ASP.NET Core上,Web api 辅助工具介绍二个中间件,包括:Swashbuckle和NSwag .NE ...
- Chapter 4 Invitations——24
"How do you do that?" I asked in amazed irritation. “你是怎么做到的?”我惊讶的问道. "Do what?" ...
- 基于spark实现并行化Apriori算法
详细代码我已上传到github:click me 一. 实验要求 在 Spark2.3 平台上实现 Apriori 频繁项集挖掘的并行化算法.要求程序利用 Spark 进行并行计算. ...
- nodejs搭建web项目
如果要使用cnpm可安装淘宝cnpm镜像(事实证明不建议使用,因为cnpm和npm有一些包不同步)npm install -g cnpm --registry=https://registry.npm ...
- API网关模式
什么是网关 网关一词来源于计算机网络中的定义,网关(Gateway)又称网间连接器.协议转换器.网关的准确定义是: 两个计算机程序或系统之间的连接,网关作为两个程序之间的门户,允许它们通过不同计算机之 ...
- win2008R2环境配置
1)下载系统 [https://msdn.itellyou.cn/] 选择带sp1的,这个系统是08R2中较为完善的一种 2)安装之后首先不要激活和安装.net framework 先安装ii ...
- ASP.NET Web API决跨域问题
记录最近一次的项目开发中遇到的问题和解决方式.在给移动端开放数据接口的时候,移动端开放人员反映部署到测试环境的接口调用访问出现了问题,但是在单独进行访问是可以正常的.那么,问题就来了. 根据查询园子里 ...
- Java开发笔记(二十九)大整数BigInteger
早期的编程语言为了节约计算机的内存,给数字变量定义了各种存储规格的数值类型,比如字节型byte只占用一个字节大小,短整型short占用两个字节大小,整型int占用四个字节大小,长整型long占用八个字 ...
- Java开发笔记(三十)大小数BigDecimal
前面介绍的BigInteger只能表达任意整数,但不能表达小数,要想表达任意小数,还需专门的大小数类型BigDecimal.如果说设计BigInteger的目的是替代int和long类型,那么设计Bi ...