REST 和 RESTfulAPI

REST是REpresentational State Transfer表述性状态转移 的首字母缩写,是一种基于超媒体构建分布式系统的架构风格。与其他架构风格一样,REST有其指导原则和约束。如果接口设计时需要引用RESTful API 规范,则必须满足这些原则。

REST的指导原则

  • 客户端 - 服务器 : 通过将用户接问题与数据存储问题分开,通过简化服务器组件来提高跨多个平台的用户接口的可移植性并提高可伸缩性。

  • 无状态 : 从客户端到服务器的每个请求都必须包含理解请求所需的所有信息,并且不能利用服务器上任何存储的上下文。因此,会话状态完全保留在客户端上。

  • 可缓存 : 缓存约束要求将对请求的响应中的数据隐式或显式标记为可缓存或不可缓存。如果响应是可缓存的,则客户端缓存有权重用该响应数据以用于以后的等效请求。

  • 统一接口 : 通过将通用性的软件工程原理应用于组件接口,简化了整个系统架构,提高了交互的可见性。为了获得统一的接口,需要多个架构约束来指导组件的行为。REST由四个接口约束定义:

    • 资源识别 : 接口必须唯一标识客户端和服务器之间交互中涉及的每个资源。
    • 通过陈述来处理资源 : 资源应该在服务器响应中具有统一的标识。API 使用者应该使用这些标识来修改服务器中的资源状态。
    • 自我描述性的信息 : 每个资源标识应该携带足够的信息来描述如何处理消息。它还应该提供客户端可以对资源执行的附加操作的信息。
    • 超媒体作为应用程序状态的引擎 : 客户端应该只有应用程序的初始 URI。客户端应用程序应使用超链接动态驱动所有其他资源和交互。
  • 分层系统 :分层系统风格允许通过约束组件行为来使体系结构由分层层组成,这样每个组件都不能“看到”超出与它们交互的直接层。

  • 按需编码(可选) - REST允许通过以小程序或脚本的形式下载和执行代码来扩展客户端功能。这通过减少预先实现所需的功能数量来简化客户端。

资源与资源方法

资源

  • REST中信息的关键抽象是一种资源。可以命名的任何信息都可以是资源:文档或图像,临时服务,其他资源的集合,非虚拟对象(例如,人)等。

  • REST使用资源标识符来标识组件之间交互中涉及的特定资源。

  • 资源在任何特定时间的状态称为资源表示。资源主要包括:

    • 数据
    • 描述数据的 元数据
    • 可以帮助客户过渡到下一个所需状态的 超媒体链接。
  • REST API 由一组相互链接的资源组成。这组资源称为 REST API 的 资源模型。

  • 资源表示应该是自描述的:客户端不需要知道资源是员工还是设备

资源方法

  • 与 REST 相关的另一个重要事情是 资源方法。这些资源方法用于在任何资源的两种状态之间执行所需的转换。
  • 将资源方法与HTTP GET / PUT / POST / DELETE方法联系起来是错误的。
  • 基于查询的API结果应该由带有摘要信息的链接列表表示
  • REST和HTTP不一样!! REST是一种架构设计风格,而非是HTTP规定的协议。

RESTful API的特点

  • 客户端在通过 API 与后端服务通信的过程中,建议使用 HTTPS 协议。

  • API 的根入口点应尽可能保持足够简单。

  • 使用 - 而不是使用 _ 做URL路径中字符串连接。

  • 使用Token令牌来做用户身份的校验与权限分级,而不是Cookie。

  • 在 URL 中嵌入版本编号时所有的 API 必须保持向后兼容,你必须在引入新版本 API 的同时确保旧版本 API 仍然可用。

  • 特定资源或资源集合的 URL在设计时必须遵循以下约定:

    • HTTP 动词作用的对象。它应该是名词,不能是动词。
    • URL 的命名 必须 全部小写
    • URL 中资源(resource)的命名 必须 是名词,并且 必须 是复数形式
    • 必须 优先使用 Restful 类型的 URL
    • URL 必须 是易读的
    • URL 不能暴露服务器架构
    • 避免多级 URL,这种 URL 不利于扩展,语义也不明确,查询字符串的写法会更好。
  • 对于资源的具体操作类型,由 HTTP 动词表示。常用的 HTTP 动词有下面五个:

    • GET(SELECT):从服务器取出资源(一项或多项)。
    • POST(CREATE):在服务器新建一个资源。
    • PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)。
    • PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)。
    • DELETE(DELETE):从服务器删除资源。
  • 如果记录数量很多,服务器不可能都将它们返回给用户。API 应该 提供参数,过滤返回结果。下面是一些常见的参数:

    • ?limit=10:指定返回记录的数量
    • ?offset=10:指定返回记录的开始位置。
    • ?page=2&per_page=100:指定第几页,以及每页的记录数。
    • ?sortby=name&order=asc:指定返回结果按照哪个属性排序,以及排序顺序。
    • ?animal_type_id=1:指定筛选条件
  • 所有的 API 响应,必须 遵守 HTTP 设计规范,必须 选择合适的 HTTP 状态码。下面列举了常见的 HTTP 状态码(所有 API 一定不可 返回 1xx 类型的状态码)

    • 1xx 代表请求已被接受,需要继续处理
    • 2xx 请求已成功,请求所希望的响应头或数据体将随此响应返回
    • 3xx 重定向
    • 4xx 客户端原因引起的错误
    • 5xx 服务端原因引起的错误
  • 返回结果必须使用JSON, 必须把错误信息直接放到响应实体中,并且错误格式 应该 满足如下格式:

      {"message": "您查找的资源不存在","error_code": 404001}
    

总结

  • 在REST架构风格中,数据和功能被视为资源,并使用统一资源标识符(URI)进行访问。
  • 通过使用一组简单,定义明确的操作来执行资源。
  • 客户端和服务器通过使用标准化接口和协议(通常是HTTP)来交换资源的表示。
  • 资源与其表示分离,以便可以以各种格式访问其内容,例如HTML,XML,纯文本,PDF,JPEG,JSON等。例如,可以使用和使用关于资源的元数据来控制高速缓存,检测传输错误,协商适当的表示格式,以及执行认证或访问控制。
  • 最重要的是,与资源的每次交互都是无状态的。

相关链接

  • RESTful官方文档
  • SOAP与REST API的区别
  • RESTful API 设计规范

RESTful API 规范相关推荐

  1. php restful规范,RESTFul API规范 详细指南

    RESTFul规范 RESTFul是一种HTTP API接口规范,只要满足的RESTFul规范,即可称为RESTFul API. 既然是接口,我们先来了解一下,他和传统的API接口有何不同吧. 本文以 ...

  2. 【Restful】你还不懂Restful API规范吗?

    进入正文之前,先带着小伙伴们了解几个名词,源自百度百科. 标题中涉及的核心名词API,restful 扩展 何为API呢? API(Application Programming Interface, ...

  3. 阮一峰RESTful API规范

    一.URL 设计 1.1 动词 + 宾语 RESTful 的核心思想就是,客户端发出的数据操作指令都是"动词 + 宾语"的结构.比如,GET /articles这个命令,GET是动 ...

  4. 初识 RESTful API规范

    简介 一种软件架构风格.设计风格,而不是标准,只是提供了一组设计原则和约束条件.它主要用于客户端和服务器交互类的软件.基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制. rest是一种 ...

  5. restful api接口规范_如何理解RESTful API设计规范?

    作者:涂根华 https://www.cnblogs.com/tugenhua0707/p/12153857.html RESTful是目前最流行的API设计规范,它是用于Web数据接口的设计.从字面 ...

  6. rest api是什么_一文搞懂什么是RESTful API

    RESTful接口实战 首发公众号:bigsai 转载请附上本文链接 文章收藏在回车课堂 前言 在学习RESTful 风格接口之前,即使你不知道它是什么,但你肯定会好奇它能解决什么问题?有什么应用场景 ...

  7. restful api和普通api有什么特点_Django REST Framework教程(1): 什么是序列化和RESTful的API

    小编曾经承诺的Django REST Framework原创系列教程终于赶上了2020年那年夏天的尾巴,姗姗而来.我们将用不少于10篇的原创文章系统性地介绍如何使用这个框架开发符合RESTful规范的 ...

  8. RESTful API接口文档规范小坑

    希望给你3-5分钟的碎片化学习,可能是坐地铁.等公交,积少成多,水滴石穿,谢谢关注. 前后端分离的开发模式,假如使用的是基于RESTful API的七层通讯协议,在联调的时候,如何避免配合过程中出现问 ...

  9. RESTful API 编写规范

    基于一些不错的RESTful开发组件,可以快速的开发出不错的RESTful API,但如果不了解开发规范的.健壮的RESTful API的基本面,即便优秀的RESTful开发组件摆在面前,也无法很好的 ...

最新文章

  1. 使用Blender中的几何节点创建程序对象
  2. web.xml配置错误页面,及输出错误信息
  3. 物联网技术周报第 141 期: 使用 Alexa Voice 和 Raspberry Pi 构建图片识别应用
  4. JS检测浏览器是否最大化
  5. docker certbot 一键申请https证书、证书过期续订、续订成功自动重启服务
  6. Spring MVC+Spring+Mybatis+MySQL(IDEA)入门框架搭建
  7. 智课雅思短语---二、exert positive/ negative effects on…
  8. 破解成功!iMac成功运行WindowsXP系统
  9. CentOS6.5下安装Open vSwitch
  10. 达梦共享存储集群DMDSC-2节点部署手册
  11. 我的世界高亮显示服务器,waila(我的世界高亮显示没了)
  12. Web安全 Msfconsole攻击技术(成功拿下服务器最高权限.)
  13. 串口协议包的接收及解析处理
  14. C语言 --- sizeof() 7种使用详解
  15. 互联网运营起步 |《从零开始做运营》读书笔记
  16. 牛客刷题——两种排序方法
  17. 风之语.至贱城市之成都
  18. Excel·VBA选中列一键计算小计总计
  19. 职场遭遇“小人”,你如何应对?
  20. 【STM32】RTC实时时钟概述、寄存器、库函数(RTC一般步骤)

热门文章

  1. Python爬虫-Scrapy框架(四)- 内置爬虫文件 - 4.2 初探Crawl Spider
  2. 解锁scrapy报错:Unknown command: crawl
  3. 恒压供水(3托3) 功能: 三拖三(3台变频3台水泵)
  4. 那类水果含维生素B多?
  5. 心之所向,素履以往——有许多困难,我们不得不独自面对
  6. Python学习笔记之基础语法--input outpupt json
  7. Keil MDK终于免费了,没有代码大小限制
  8. Neo4j CQL(函数、索引、约束)、备份恢复、优化
  9. ng-include指令
  10. winform的combobox的selectedValue使用问题