Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >RESTful API模式系列三:资源

RESTful API模式系列三:资源

作者头像
陆道峰
发布于 2020-06-17 14:04:15
发布于 2020-06-17 14:04:15
1.3K00
代码可运行
举报
运行总次数:0
代码可运行

说明

  • 原文链接:http://restful-api-design.readthedocs.io/en/latest/resources.html
  • adolphlwq:https://github.com/adolphlwq
  • 项目地址:https://github.com/adolphlwq/translate
  • 翻译/校对:3.5h
  • 知识共享许可协议: CC4.

资源是任何RESTful API中的基本概念。资源是对象,包括类型、关联的数据、资源间的关系以及资源上的操作集合。它和面向对象编程语言中的对象类似,不同点在于资源 只定义了有限的标准方法(对应HTTP协议中标准的GET,POST,PUT,DELETE方法),而对象实例可以有很多方法。

资源可以被分类到不同的集合中。每个集合都包含一种类型的资源,因此集合都是均匀(homogeneous)的。资源也可以不分到集合里,这些资源我们称为singleton resources

集合可以全局存在,即API顶层(译者注:原文at the top level of an API),也可以包含在single resource中。后文中,我们把这种集合称为sub-collections,子集通常用来表达“包含于”的关系。我会在Relationships详细介绍。

下图描述了RESTful API的关键概念:

我们把描述资源的类型、行为和关系的信息称为API的资源模型。RESTful中的资源模型可以视为到应用数据模型的映射。

资源数据

资源关联数据。API的资源模型还包括关联数据的丰富性。比如,它定义了哪些可用的数据类型和行为。

就我个人经验,我坚信JSON这种数据模型完美满足API的丰富性要求,它是RESTful资源的理想数据模型。我会推荐给每个人。

JSON中已经存在三种类型数据:

  • scalar(标量:number, string, boolean, nul)
  • array
  • object

标量类型只有一个值。数组包含任意类型值的有序列表。对象是无序的key/value(键/值对)集合(亦称为属性,但是不要和XML中的属性概念搞混),key是字符串,value可以是任意类型。更多JSON细节请参考JSON web site。

为什么如此偏爱JSON?以我个人观点,JSON在表达性和广泛应用上拥有良好的平衡。scalars、arrays和objects这三种类型足够强大,能够以自然的方式描述资源中暴露的数据,同时JSON足够小巧,几乎任何现代语言都可以内置支持JSON。

XML也是以为有力的竞争者(contender)。实际上,RHEV-M(译者注:红帽的一款产品)最终API中就使用XMLSchema来描述资源。事后来看(With hindsight),RESTful API使用XML模型是个糟糕的选择。一方面,它过于丰富;另一方面,它又缺少一些特性。XML作为标准通用标记语言的一个分支(SGML off-shoot),我认为它在表示结构化文档是伟大的,但是不适合表示结构化数据

XML一些过于丰富的特性有:

  • Attributes vs elements(属性与元素)。XML可以既有属性,也包含子元素。包含数据项的资源可以被编码成任意一种。这导致客户端或者服务端事先不清楚该使用哪一个。
  • Relevance of order(顺序相关性)。子元素间的顺序也会关联到XML中,我认为对象间的属性就不是自然的有序了

XML数据模型的缺点有:

  • 没有类型。XML文档中的元素没有类型,为了使用类型需要引入XMLSchema,不幸的是XMLSchema规范非常复杂。
  • 没有列表。XML不能原生表达列表。这可能导致问题:不清楚某个元素是列表还是对象,或者两者都是。

应用数据

我们使用以下规则定义可以与JSON数据模型映射的资源数据:

  1. 资源被建模为JSON对象。资源的类型存储在特殊的键值对_type中。
  2. 资源中的数据表示为JSON对象中的键值对。为了避免和JSON对象内部键值对冲突,键不能以“_”开头
  3. 键值对中的值可以是JSON中任意原生类型: string、number、boolean、null或者arrays。值还可以是对象,这种情况下值表示嵌套的资源。
  4. 集合表示成对象数组。

我们也会把键值对认为JSON对象中的属性,这里不详细描述区别,都使用统一的术语。这样JSON中的属性就不会和XML中的属性冲突了。

REST元数据

除了暴露应用数据,资源中还有RESTful API相关特殊的数据。这些信息包括URLs和relationships。

下表列出了所有资源中定义的,通用、有特殊含义的属性:

Attribute

Type

Meaning

id

String

Identifies the unique ID of a resource

href

String

Identifies the URL of the current resource

link

object

Identifies a relationship for a resource. This attribute is itself an object and has “rel” “href” attributes

其它数据

通常,除了应用数据、REST元数据外,我们还需要一些数据。这通常是“类RPC”数据,其中需要设置操作,但是设置最终不会作为资源本身一部分。

这里我能列举的例子是,创建新资源过程中需要引用另一个资源,但是被引用的资源最终不会成为创建资源的一部分。

将应用数据、REST元数据和其它数据合并到资源中是API代码的职责,有可能要解决可能出现的名称冲突的问题。

表示

我们已经定义了资源,同时也介绍了资源数据和JSON数据模型间的映射关系。但是,这些资源仍然是抽象的实体。在它们通过HTTP链接和客户端通信前,它们需要被序列化成文本表现形示。然后这种文本表示就可以作为实体包含在HTTP消息体中。

以下表示类型是资源常用的,该表还可使用的内容类型:

Type

Content-Type

JSON

application/x-resource+json application/x-collection+json

YAML

application/x-resource+yaml application/x-collection+yaml

XML

application/x-resource+xml application/x-collection+xml

HTML

text/html

注意:所有使用x-前缀的内容类型都是实验阶段,RFC2046也是认可的。

JSON格式

将资源序列化为JSON格式很简单,因为资源的数据模型是根据JSON模型定义的。下面我们给出一个虚拟机JSON序列化的例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
 "_type": "vm",
 "name": "A virtual machine",
 "memory": 1024,
 "cpu": {
   "cores": 4,
   "speed": 3600
 },
 "boot": {
   "devices": ["cdrom", "harddisk"]
 }
}

YAML格式

YAML格式和JSON稍微不同,JSON中键值对里的“_type”在YAML中替换为“!type”注解。上面的虚拟机实例的YAML格式为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
!vm
name: A virtual machine
memory: 1024
cpu:
 cores: 4
 speed: 3600
boot:
 devices:
 - cdrom
 - harddisk

XML格式

由于XML的复杂性和限制,XML表示法是最复杂的。我推荐下面的规则:

  • 资源映射到XML元素,加上标签名表示资源类型。
  • 资源属性映射到XML子元素,标签名表示属性名。
  • 标量表示成文本节点。标量元素中关键字“type”表示标量类型,这种映射要遵守XML Schema Part 2。
  • 列表要存储为单个的容器元素,其中每个列表项都有子元素。容器元素的标签应当是属性名称英文复数,item标签应该是属性名称的英文单数。列表应该具有“xd:list”类型注释。

相同的虚拟机资源的XML表示格式为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<vm xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <name type="xs:string">My VM</name>
 <memory type="xs:int">1024</memory>
 <cpu>
   <cores type="xs:int">4</cores>
   <speed type="xs:int">3600</speed>
 </cpu>
 <boot>
   <devices type="xs:list">
     <device type="xs:string">cdrom</device>
     <device type="xs:string">harddisk</device>
   </devices>
 </boot>
</vm>

HTML格式

HTML响应的精确格式应该是API相关的。HTML是为人类使用设计的,因此唯一要求是易于理解。一个简单实现可以是下面的表示法:

  • 对于集合,使用<table>标签表示,每一列表示一个属性,每一行表示一个对象。
  • 对于资源,使用<table>标签和两列表示,一列表示所有的属性名,一列表示属性对应的值。

Content-Types

根据上文内容,我主张使用的通用内容类型是“application/x-resource+format”和“application/x-collection+format”。在我看来,它们代表了RESTful API中常见的两个极端情形的中间情形:

一类RESTful API只使用“空的”(译者注:bare)XML、JSON或者YAML内容类型。这种情况下,内容类型只表示实体的类型是XML、JSON或者YAML。在我看来,这依然不够。因为资源和集合会有一些特定的语义,例如“href”属性,“link”属性和type。Therefore, these are a specialization of XML, JSON and YAML and should be defined as such(译者注:这里不翻译是因为没看懂)。

另一类RESTful API会为资源模型中的每个资源类型都定义内容类型。一个例子是vSphere Director API。在我看来这也不妥。指定详细的内容类型会导致API方和客户端方认为这些类型有特定的接口。我认为所有的资源应该共享那些相同的、基本的接口,这些基本接口是符合RESTful设计原则,内容类型表示为“application/x-resource”。

一个原因是,通过 有利于内容类型 细节定义 的方法,内容类型可以和某些类型定义语言(如XMLSchema)中的属性相关连。据推测,这有利于客户端自动发现,因为客户端知道某种类型的可用属性。我在Forms讨论(go into)了很多这个主题的细节,但总结下来我并不统一这个论点。

选择表式格式

客户端可以通过HTTP“Accept”头表示客户端使用哪种合适。HTTP RFC声明了详尽的规则,规则中可以请求多种格式,没中格式都有自己的优先级。下面的例子中客户端告诉API它只接受YAML格式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET /api/collection
Accept: application/x-collection+yaml

译者说

本文在HTTP协议的背景下,介绍了RESTful中的资源包含那些类型的数据;资源与JSON、XML、YAML等格式间的映射规则。作者支持将资源映射称JSON格式。 阅读本文还需要了解HTTP协议,否则很多属于很难理解。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-03-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器学习与系统 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
浏览器页面渲染全解析过程优化及实战指南详解
将HTML、CSS和JavaScript转换为屏幕上的像素,实现用户可交互的视觉界面。
用户2102001
2025/05/22
1790
浏览器页面渲染全解析过程优化及实战指南详解
你真的了解回流和重绘吗?(面试必问)
回流和重绘可以说是每一个web开发者都经常听到的两个词语,我也不例外,可是我之前一直不是很清楚这两步具体做了什么事情。最近由于部门内部要做分享,所以对其进行了一些研究,看了一些博客和书籍,整理了一些内容并且结合一些例子,写了这篇文章,希望可以帮助到大家。
Jean
2018/12/17
2.2K0
你真的了解回流和重绘吗?(面试必问)
前端| 性能优化总结
HTTP1.1 如果要同时发起多个请求,就得建立多个 TCP 连接,因为一个 TCP 连接同时只能处理一个 HTTP1.1 的请求。在 HTTP2 上,多个请求可以共用一个 TCP 连接,这称为多路复用。同一个请求和响应用一个流来表示,并有唯一的流 ID 来标识。多个请求和响应在 TCP 连接中可以乱序发送,到达目的地后再通过流 ID 重新组建。
Java小技巧
2022/10/27
7940
前端面试总结与思考
序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生;给字节编上序号后,就给每一个报文段指派一个序号;序列号seq就是这个报文段中的第一个字节的数据编号。
李才哥
2019/09/20
9640
前端面试总结与思考
Web 性能优化-页面重绘和回流(重排)
常见的优化网络请求的方法有:DNS Lookup,减少重定向,避免 JS、CSS 阻塞,并行请求,代码压缩,缓存,按需加载,前端模块化…
李振
2021/11/26
1.2K0
Web 性能优化-页面重绘和回流(重排)
浏览器的渲染流程--重排、重绘、合成
定义: 当通过JS或css改变了元素的宽度、高度等,修改了元素的几何位置属性,那么浏览器会触发重新布局,解析之后的一系列子阶段,这个过程就叫重排。无疑, 重排需要更新完整的渲染流水线,所以开销也是最大的。
用户7741497
2022/03/06
1.2K0
【前端性能优化】深入解析重绘和回流,构建高性能Web界面
在Web浏览器的工作流程中,回流是一个关键步骤,它发生在浏览器需要根据DOM元素的尺寸、位置或某些视觉属性变化来重新计算元素的布局情况时。具体来说,当一个元素的几何属性改变,比如宽度、高度或者隐藏/显示状态变动,浏览器执行以下步骤:
空白诗
2024/06/14
2920
【前端性能优化】深入解析重绘和回流,构建高性能Web界面
浏览器渲染之回流重绘
回流和重绘是前端开发的高频词汇之一,你可以在各种面经,性能优化相关文章可以看到,但是很多都是草草带过。本文带你从浏览器渲染流程中了解回流与重绘的原理。
政采云前端团队
2021/09/30
1.8K0
浏览器渲染之回流重绘
十人九问,回流和重排怎么优化?
节点的一些样式(背景色,边框颜色,文字颜色等)发生改变,只需要应用新样式绘制这个元素就可以了; 发生机制: 颜色 visibility: hidden,元素还是占了位置的
程序媛夏天
2024/01/18
2100
十人九问,回流和重排怎么优化?
浏览器重绘与回流
重绘与回流是浏览器渲染的时候进行的操作,当页面内容发生改变的时候,就会触发重绘或者回流
WindRunnerMax
2020/08/27
1K0
浏览器请求与渲染全过程
在今天的数字化世界,网页加载是一个技术流程,涉及多个步骤。当我们在浏览器中输入网址并按下回车键时,这些请求会经历一系列处理,最终呈现为一个完整的网页。这个过程包括解析网址、查询域名、建立网络连接,以及接收和显示数据。本文将详细介绍这些步骤,帮助读者更好地理解网页是如何从请求到显示的整个过程。
用户6256742
2024/08/01
3230
【前端面试题】我靠它拿到了大厂Offer
instanceof 的内部机制是通过判断对象的原型链中是不是能找到类型的 prototype。
前端修罗场
2023/10/07
1.2K0
【前端面试题】我靠它拿到了大厂Offer
客户端渲染页面、DOM重绘和回流、避免DOM的回流
HelloWorldZ
2024/03/20
1670
chrome对页面重绘和回流以及优化进行优化
页面的绘制时间(paint time)是每一个前端开发都需要关注的的重要指标,它决定了你的页面流畅程度。而如何去观察页面的绘制时间,找到性能瓶颈,可以借助Chrome的开发者工具。
周陆军博客
2023/04/09
9610
浏览器的回流与重绘 (Reflow & Repaint)
当Render Tree中部分或全部元素的尺寸、结构、或某些属性发生改变时,浏览器重新渲染部分或全部文档的过程称为回流。 会导致回流的操作:
Nealyang
2019/09/29
7080
「一道面试题」输入URL到渲染全面梳理中-页面渲染篇
接上文,上文我们讲了网络通信的部分,详细请看「一道面试题」输入URL到渲染全面梳理上-网络通信篇, 那么该说说页面渲染的流程了,也就是当输入一个URL拿到了页面后,浏览器怎么解析,怎么呈现
isboyjc
2022/03/28
8340
「一道面试题」输入URL到渲染全面梳理中-页面渲染篇
【春节日更】重排 与 重绘 的知识点
重排(回流/reflow):当渲染树的一部分必须更新并且节点的尺寸发生了变化,浏览器会使渲染树中受到影响的部分失效,并重新构造渲染树。
用户9914333
2022/07/22
8430
【春节日更】重排 与 重绘 的知识点
Web前端性能优化(二)
懒加载 即延迟加载,在电商或是页面很长的业务场景中,我们通常会使用懒加载的方式对图片进行请求,只有在图片进入可视区域之后才请求图片资源,而在之前都通过一张占位图进行占位,将真正的图片路径存储在元素的 data-url 中,这样做的好处在于减少无效资源的加载,并不是所有的用户都会浏览完网站的所有图片,而且浏览器是存在并发上限的,并发加载的资源过多会阻塞 JS 的加载,影响网站的正常使用
Nian糕
2018/12/24
8450
Web前端性能优化(二)
【总结】2072- 前端常见性能优化策略
采用域名分片技术,将资源放到不同的域名下。接触同一个域名最多处理6个TCP链接问题。
pingan8787
2024/06/19
1760
【总结】2072- 前端常见性能优化策略
重绘与回流_html回流重绘
浏览器在渲染一个页面时,会将页面分为很多个图层,图层有大有小,每个图层上有一个或多个节点。 也就是我们各种各样的Dom标签
全栈程序员站长
2022/11/01
1.5K0
重绘与回流_html回流重绘
相关推荐
浏览器页面渲染全解析过程优化及实战指南详解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验