一说到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风格架构的更多相关文章

  1. REST 风格架构

       ------------------------------ 时间不多了, 抓紧做一些有意义的事情 REST 风格架构   1. 他是面向资源进行开发的   2. 他是基于HTTP 协议进行开发 ...

  2. 使用REST风格架构您需要知道的一些事

    1. REST的由来 2. REST的构成 2.1. 资源 2.2. 资源的表述 2.2.1. MIME(Multipurpose Internet Mail Extensions) 2.2.2. 缓 ...

  3. 向架构师进军-->可重用架构资源

    如果你对项目管理.系统架构有兴趣,请加微信订阅号"softjg",加入这个PM.架构师的大家庭 软件架构有三个主要来源:拿取.方法以及直觉.拿取也就是可重用资源.对于一个标准的系统 ...

  4. Rest风格WEB服务(Rest Style Web Service)的真相

    http://blog.csdn.net/jia20003/article/details/8365585 Rest风格WEB服务(Rest Style Web Service)的真相 分类: J2E ...

  5. SpringMVC+Json构建基于Restful风格的应用(转)

    一.spring 版本:spring-framework-3.2.7.RELEASE 二.所需其它Jar包: 三.主要代码: web.xml <?xml version="1.0&qu ...

  6. [我所理解的REST] 3.基于网络应用的架构

    上篇中解释到什么是架构风格和应该以怎样的视角来理解REST(Web的架构风格).本篇来介绍一组自洽的术语,用它来描述和解释软件架构:以及列举下对于基于网络的应用来说,哪些点是需要我们重点关注的. 1 ...

  7. [解读REST] 3.基于网络应用的架构

    链接上文[解读REST] 2.REST用来干什么的?,上文中解释到什么是架构风格和应该以怎样的视角来理解REST(Web的架构风格).本篇来介绍一组自洽的术语,用它来描述和解释软件架构:以及列举下对于 ...

  8. NLayerAppV3--.net Core2实现的DDD分层架构

    虽然每天的工作都是CURD.还是使用着传统的三层架构.使用着.net Framework,但是这并不能影响我学习DDD和.net core. 总是希望软件在应对复杂多变的场景时能够游刃有余,在解决问题 ...

  9. asp.net core系列 64 结合eShopOnWeb全面认识领域模型架构

    一.项目分析 在上篇中介绍了什么是"干净架构",DDD符合了这种干净架构的特点,重点描述了DDD架构遵循的依赖倒置原则,使软件达到了低藕合.eShopOnWeb项目是学习DDD领域 ...

随机推荐

  1. C/C++数据在内存中的存储方式

    目录 1 内存地址 2 内存空间   在学习C/C++编程语言时,免不了和内存打交道,在计算机中,我们存储有电影,文档,音乐等数据,这些数据在内存中是以什么形式存储的呢?下面做一下简单介绍. 本文是学 ...

  2. 【T-SQL】系列文章全文目录(2017-06-26更新)

    本系列[T-SQL]主要是针对T-SQL的总结. SQL基础 [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础]02.联接查询 [T-SQL基础]03.子查询 [T-SQL基础]0 ...

  3. Java:多态乃幸福本源

    01 多态是什么 在我刻板的印象里,西游记里的那段孙悟空和二郎神的精彩对战就能很好的解释“多态”这个词:一个孙悟空,能七十二变:一个二郎神,也能七十二变:他们都可以变成不同的形态,但只需要悄悄地喊一声 ...

  4. 死磕 java集合之TreeMap源码分析(四)-内含彩蛋

    欢迎关注我的公众号"彤哥读源码",查看更多源码系列文章, 与彤哥一起畅游源码的海洋. 二叉树的遍历 我们知道二叉查找树的遍历有前序遍历.中序遍历.后序遍历. (1)前序遍历,先遍历 ...

  5. 多机部署redis5.0集群环境

    redis5.0集群部署 一.集群介绍 Redis 集群是一个可以在多个 Redis 节点之间进行数据共享的设施(installation). Redis 集群不支持那些需要同时处理多个键的 Redi ...

  6. 知其所以然~redis的原子性

    原子性 原子性是数据库的事务中的特性.在数据库事务的情景下,原子性指的是:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节. 对于Redis而言,命 ...

  7. 实战Kafka ACL机制

    1.概述 在Kafka0.9版本之前,Kafka集群时没有安全机制的.Kafka Client应用可以通过连接Zookeeper地址,例如zk1:2181:zk2:2181,zk3:2181等.来获取 ...

  8. python学习第一讲,python简介

    目录 python学习第一讲,python简介 一丶python简介 1.解释型语言与编译型语言 2.python的特点 3.python的优缺点 二丶第一个python程序 1.python源程序概 ...

  9. 解决Mysql错误:ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (111)

    需要重启服务器:sudo /etc/init.d/mysql restart

  10. 第47章 授权端点(Authorize Endpoint) - Identity Server 4 中文文档(v1.0.0)

    授权端点可用于通过浏览器请求令牌或授权码.此过程通常涉及最终用户的身份验证和可选的同意. 注意 IdentityServer支持OpenID Connect和OAuth 2.0授权请求参数的子集.有关 ...