一说到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. CentOS6.9下离线部署Django项目

    最近项目服务器变动,研究了CentOS6.9下httpd2.4+django1.11.16+python3.6+PostgreSQL的部署,之前还有一个ubuntu16.04下的部署等以后整理好后再来 ...

  2. windows服务器解决挖矿程序问题

    前几天发现服务器报警,cpu使用率已达100%,查资料知道正是最近比较流行的挖矿程序在捣鬼.我们使用的是阿里云的服务器,操作系统是windows server.网上有大量的资料讲如何处理,我把自己处理 ...

  3. 自定义圆形的ProgressBar

    1.自定义圆形的ProgressBar 效果图: 圆形ProgressBar的样式主要有以下几个,我们这里以progressBarStyleLarge为例进行样式的修改,其他的类似. <Prog ...

  4. ASP.NET Core中如何针对一个使用HttpClient对象的类编写单元测试

    原文地址: How to unit test a class that consumes an HttpClient with IHttpClientFactory in ASP.NET Core? ...

  5. Shiro中的授权问题

    在初识Shiro一文中,我们对Shiro的基本使用已经做了简单的介绍,不懂的小伙伴们可以先阅读上文,今天我们就来看看Shiro中的授权问题. Shiro中的授权,大体上可以分为两大类,一类是隐式角色, ...

  6. 程序员过关斩将--面试官再问你Http请求过程,怼回去!

    菜菜哥,X总在产品部瞎指挥,作为程序媛的我都快撑不住了 不光你撑不住了,大家都要撑不住了,外行人指导内行人,呵呵 前天我偷偷的去面试了,结果挂了 出去转转其实是好事,面试官问你什么了? 他让我描述一个 ...

  7. React Fiber 数据结构揭秘

    此章节会通过两个 demo 来展示 Stack Reconciler 以及 Fiber Reconciler 的数据结构. 个人博客 首先用代码表示上图节点间的关系.比如 a1 节点下有 b1.b2. ...

  8. Docker中安装WordPress

    前言 虚拟化技术风靡一时,还不层在生产环境中实践.只能是闭门造车,自己玩一玩了,接触了一下docker最简单的命令,这才自己搭建一个wordpress玩一玩. 安装wordpress之前先把本机的do ...

  9. ZXing 生成、读取二维码(带logo)

    前言 ZXing,一个支持在图像中解码和生成条形码(如二维码.PDF 417.EAN.UPC.Aztec.Data Matrix.Codabar)的库.ZXing(“zebra crossing”)是 ...

  10. css中“~”和“>”

    css中“~” element1~element2 选择器匹配  出现在   element1 后面的    element2  .element1 和 element2 这两种元素必须具有相同的父元 ...