草庐IT

API 入门 (18) 认识 REST

品品下午茶 2023-03-28 原文

API 设计是有风格的,RPCRESTGraphQL 是当前比较流行的三种设计风格。在后面的文章中,我们会采用 REST 风格,对 API 进行设计和实现,所以本文就和大家一起认识一下 REST.

RESTRepresentational State Transfer 的缩略词表示,直译过来就是表征状态传输,具象状态传输,表述性状态转移,表现状态传输等,这也是网络上常见等译法。这种直译,让人有种知道每个词的意思,但不知道这些词组合起来在说什么的感觉。

所以,我们先来了解一下 REST 的产生,再尝试解释一下这个术语。

REST 历史

2000年,Roy Thomas Fielding 在他的博士学位论文——《Architectural Styles and the Design of Network-based Software Architectures》——中提出了 REST 架构风格,并在论文的第五章,CHAPTER 5 Representational State Transfer (REST),详细阐述了 REST 架构风格。与此同时,论文的作者正在进行 HTTP 1.1 协议的开发工作。正是这项工作,促成了 REST 架构风格的产生。

REST 架构风格的目标就是帮助构建高效的、可扩展的、可靠的分布式系统。分布式系统也是一个比较抽象的词,在这里,我们可以理解为由许多位于不同计算机上的软件组成,相互之间靠网络连接和通信,协同完成工作的系统。

论文作者提出,REST 架构风格的设计要满足下面六个约束(constraint)要求:

  1. Client/server 约束 — Client/server 约束遵循的原理是相关性隔离。当移动应用和API服务一起工作,完成用户目标时,必须明确划分他们的职责。
  2. Statelessness — 无状态性。每一个请求(从客户端到服务器),必须包含所有必要的信息,让服务能够理解和处理该请求,不能利用服务端存储的信息。换句话说,客户端保存完整的会话信息。
  3. Cacheability — 缓存能力。客户端能够存储来自服务器的响应数据,也能选择不存储。如果客户端存储了响应的数据,客户端可以重用响应数据,不必再向服务器发送请求。
  4. Layered system — 分层系统。服务器的系统分层设计,可以隐藏复杂的结构和逻辑。客户端只需要和系统的某一个层进行交互,不需要了解其背后处理的具体逻辑。TCP 协议就是一个典型的例子。
  5. Code on demand — 按需执行代码。客户端能够根据需要,从服务器下载可运行的代码(如 Javascript),实现功能扩展。这是可选约束要求。
  6. Uniform interface — 统一接口。这是独特的核心特征,让 REST 与其他网络设计风格区分开来:组件之间要使用统一的接口风格。当然,这也是 REST 名字的来源。定义 REST 接口要满足四个要求:资源识别;通过描述对资源操作;自描述的消息;超媒体作为应用状态引擎。

REST 解释

REST(Representational State Transfer) 译成中文的关键是对 Representational 这个词的理解。

文章开头已经给出了一些网络常见翻译,现在我们从论文里找找线索。在论文的第五章里,Representational 出现了 4 次,都是以 Representational State Transfer 的组合方式使用的。他的名词形式 Representation 出现了 53 次。下面是一些相关的摘抄。

A representation is a sequence of bytes, plus representation metadata to describe those bytes.

representation 是一串有序字节及其描述它的元数据。

Other commonly used but less precise names for a representation include: document, file, and HTTP message entity, instance, or variant.

为了帮助大家理解这个词语,作者还列举了几个相似的词语:文档(document),文件(file),HTTP 消息体(HTTP message entity),实例(instance),或变量(variant)。

A representation consists of data, metadata describing the data, and, on occasion, metadata to describe the metadata (usually for the purpose of verifying message integrity).

representation 包括数据,元数据(描述数据的数据),描述元数据的数据

The data format of a representation is known as a media type.

representation 的数据格式是大家所熟知的媒体类型。

大家可以把认为合理的词放入句子里,讲的通,能明白就行。当然,也可以去原文中研读更多的语境。

这里,比较合适的词可以是表示,描述,相应的 REST 可以翻译为:

  • 可表示的状态传输
  • 可描述的状态传输

甚至是把 Representational 这个词忽略掉,到更让人容易理解。Representational 这个词强调的应该是资源的状态是可以通过某种形式让客户端识别的。不管怎样,到底是僧敲月下门,还是僧推月下门,请大家见仁见智吧。

有关API 入门 (18) 认识 REST的更多相关文章

  1. ruby - i18n Assets 管理/翻译 UI - 2

    我正在使用i18n从头开始​​构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在ruby​​onrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi

  2. ruby-on-rails - Rails 3 I18 : translation missing: da. datetime.distance_in_words.about_x_hours - 2

    我看到这个错误:translationmissing:da.datetime.distance_in_words.about_x_hours我的语言环境文件:http://pastie.org/2944890我的看法:我已将其添加到我的application.rb中:config.i18n.load_path+=Dir[Rails.root.join('my','locales','*.{rb,yml}').to_s]config.i18n.default_locale=:da如果我删除I18配置,帮助程序会处理英语。更新:我在config/enviorments/devolpment

  3. ruby-on-rails - ActionController::RoutingError: 未初始化常量 Api::V1::ApiController - 2

    我有用于控制用户任务的Rails5API项目,我有以下错误,但并非总是针对相同的Controller和路由。ActionController::RoutingError:uninitializedconstantApi::V1::ApiController我向您描述了一些我的项目,以更详细地解释错误。应用结构路线scopemodule:'api'donamespace:v1do#=>Loginroutesscopemodule:'login'domatch'login',to:'sessions#login',as:'login',via::postend#=>Teamroutessc

  4. ruby-on-rails - 如果我将 ruby​​ 版本 2.5.1 与 rails 版本 2.3.18 一起使用会怎样? - 2

    如果我使用ruby​​版本2.5.1和Rails版本2.3.18会怎样?我有基于rails2.3.18和ruby​​1.9.2p320构建的rails应用程序,我只想升级ruby的版本,而不是rails,这可能吗?我必须面对哪些挑战? 最佳答案 GitHub维护apublicfork它有针对旧Rails版本的分支,有各种变化,它们一直在运行。有一段时间,他们在较新的Ruby版本上运行较旧的Rails版本,而不是最初支持的版本,因此您可能会发现一些关于需要向后移植的有用提示。不过,他们现在已经有几年没有使用2.3了,所以充其量只能让更

  5. ruby-on-rails - Ruby on Rails I18n 插值 - 2

    大家好!我对我的:username字段进行了一个小的验证,它应该是4到30个字符。我写了一个验证::length=>{:within=>4..30,:message=>I18n.t('activerecord.errors.range')-我想显示一个错误各种错误的消息(不像,太长或太短),但这里有一个问题-我可以将最小值和最大值都传递给翻译,以便有类似的东西:用户名应该在4到30个字符之间。目前我有:range:"shouldbebetween%{count}and%{count}characters",这显然不起作用(只是为了检查)。是否可以从范围中获取这些值?谢谢大家的指教!

  6. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  7. ruby-on-rails - Mandrill API 模板 - 2

    我正在使用Mandrill的RubyAPIGem并使用以下简单的测试模板:testastic按照Heroku指南中的示例,我有以下Ruby代码:require'mandrill'm=Mandrill::API.newrendered=m.templates.render'test-template',[{:header=>'someheadertext',:main_section=>'Themaincontentblock',:footer=>'asdf'}]mail(:to=>"JaysonLane",:subject=>"TestEmail")do|format|format.h

  8. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  9. 微信小程序开发入门与实战(Behaviors使用) - 2

    @作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors    1、什么是behaviors    2、behaviors的工作方式    3、创建behavior    4、导入并使用behavior    5、behavior中所有可用的节点    6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors    1、什么是behaviorsbehaviors是小程序中,用于实现

  10. ruby-on-rails - 在 Ruby (on Rails) 中使用 imgur API 获取图像 - 2

    我正在尝试使用Ruby2.0.0和Rails4.0.0提供的API从imgur中提取图像。我已尝试按照Ruby2.0.0文档中列出的各种方式构建http请求,但均无济于事。代码如下:require'net/http'require'net/https'defimgurheaders={"Authorization"=>"Client-ID"+my_client_id}path="/3/gallery/image/#{img_id}.json"uri=URI("https://api.imgur.com"+path)request,data=Net::HTTP::Get.new(path

随机推荐