【翻译】RAML1.0规范: RESTful API模型语言(1)- 根节点

引言

本规范描述了RESTful API建模语言(RAML)。RAML是用于定义RESTful应用程序编程接口(API)的人机交互语言。RAML旨在通过提供API提供者和API消费者可以用作相互契约的格式来改进API的规范。例如,便于为客户端和服务器实现提供用户文档和源代码存根。这样的设置简化和增强了使用RESTful API的可互操作应用程序的定义和开发。

RAML引入了资源类型和特征的创新概念,用于表征和重用资源模式和相关方法。使用资源类型和特性可最大限度地减少RESTful API设计中的重复,并提高API内部和跨API的一致性。

本文件组织如下:

  • 基本信息. 如何描述API的核心方面,例如其名称,标题,位置(或URI)和默认值,以及如何包括API的支持文档。
  • 数据类型. 通过包含JSON和XML模式的流线型类型系统来建模API数据。
  • 资源. 如何在任何URI模板中指定API资源和嵌套资源,以及URI参数。
  • 方法. 如何指定API资源及其请求标头,查询参数和请求正文的方法。
  • 响应. API响应的规范,包括状态代码,媒体类型,响应头和响应正文。
  • 资源类型和特征. 可选地使用RAML资源类型和特征来表征资源。
  • 安全. 在RAML中指定API安全方案。
  • 注释. 通过定义强类型的注释并在整个规范中应用它来扩展RAML规范。
  • 包含,库,覆盖和扩展. API定义如何由外部化定义文档组成,将这些定义的集合打包到库中,在RAML文档上分离和覆盖元数据层,以及扩展具有附加功能的API规范。

RAML 1.0中的新增功能和不同之处

  • 数据类型:一种统一,简化和强大的方式来模拟数据出现在API中的任何地方。
    • 统一覆盖主体,URI参数,标题和查询参数,并且不需要单独的formParameters构造
    • 支持封装XML模式和JSON模式,甚至引用子模式,但在许多情况下,只是消除模式
    • 通过基于YAML的方式,简化了与JSON模式或XML模式的编码
  • 示例:多个示例,可在YAML中表达,并且可注释,因此可以注入语义
  • 注释:一个经过测试的,强类型的可扩展性机制
  • :改进的模块化,用于广泛重用API工件
  • 覆盖扩展:通过分隔文件增加可扩展性
  • 改进的安全计划
    • 更广泛的OAuth支持
    • 支持传递(基于密钥)安全方案
  • 一些更小的更改一致性和表达性

标记语言

本规范使用YAML 1.2作为其基本格式。YAML是一种人类可读的数据格式,与本规范的设计目标一致。与YAML中一样,所有节点(如键,值和标记)都区分大小写。

RAML API定义是符合YAML 1.2标准的文档,以符合要求的YAML注释行开头,指示RAML版本,如下所示:

#%RAML 1.0
title: My API

RAML API定义文档的第一行必须以文本开头, #%RAML后跟一个空格,后跟文本1.0,并且在当前行尾前没有其他的东西。RAML片段文档类似地开始于RAML版本注释和片段标识符,但不是自己的RAML API定义文档。

媒体类型application / raml yaml及其关联的文件扩展名.raml应用于指定包含RAML API定义,RAML片段和包含RAML标记的文件的文件。RAML还能够包括其他媒体类型的文档,诸如“application/schema+json”和“application/yaml”。

为了方便RAML文档的自动处理,除了核心YAML 1.2规范之外,RAML还强加了以下限制和要求:

  • RAML文件的第一行由指定RAML版本的YAML注释组成。因此,RAML处理器不能完全忽略所有YAML注释。
  • RAML文档中某些级别的某些属性的顺序很重要。因此,期望处理器保持这种排序。

文档的根

RAML文档的根部分描述了有关API的基本信息,例如其标题和版本。根部分还定义在RAML文档中其他位置使用的资产,例如类型和特性。

RAML记录的API定义中的节点可以按任何顺序出现。处理器必须在定义树的同一节点内保持相同类型的节点的顺序。这样的节点的示例是出现在资源树的相同级别的资源,给定资源的方法,给定方法的参数和给定类型中相同级别的节点。处理器还必须保持数组中项的顺序。

此示例显示了GitHub v3公共API的RAML API定义的一小部分。

#%RAML 1.0
title: GitHub API
version: v3
baseUri: https://api.github.com
mediaType:  application/json
securitySchemes:
  oauth_2_0: !include securitySchemes/oauth_2_0.raml
types:
  Gist:  !include types/gist.raml
  Gists: !include types/gists.raml
resourceTypes:
  collection: !include types/collection.raml
traits:
securedBy: [ oauth_2_0 ]
/search:
  /code:
    type: collection
    get:

下表列出了RAML文档根目录下的可能节点:

名称 描述
title API的简短纯文本标签。它的值是一个字符串。
description? 一个实质的,人性化的API描述。它的值是一个字符串,可以使用 markdown.格式化。
version? API版本,例如“v1”。它的值是一个字符串。
baseUri? 一个URI作为全部资源的 base for URIs 。通常用作包含API位置的每个资源的URL的基础. 可以是一个 模板URI
baseUriParameters? 命名参数中使用的baseUri (模板)。
protocols? API支持的协议
mediaType? 请求体和响应体 (负载)所使用的默认媒体类型。 例如 "application/json"。
documentation? API的其他总体 文档
schemas? 等效“types”节点的别名,以与RAML 0.8兼容。已弃用-API,定义应使用"types"节点,因为将来的RAML版本可能会删除该节点的“schemas”别名。“types”节点支持XML和JSON模式。
types? 在API中使用的 (数据) 类型的声明。
traits? 在API中使用的 特征的声明。
resourceTypes? 在API中使用的资源类型的声明。
annotationTypes? 注释中使用的注释类型的声明。
(<注释名>)? 要应用于此API的注释。注释是以"("开始,以")"结束的映射,括号中的文本是注释名称,并且该值是该注释的实例。
securitySchemes? 在API中使用的安全方案的声明。
securedBy? 适用于API中每个资源和方法的安全方案
uses? 在API中使用导入的 外部库
/<相对Uri>? API的资源,标识为以斜杠(/)开头的相对URI。资源节点是以斜杠开头的,位于API定义的根或资源节点的子节点。例如,/ users和/ {groupId}。

“schemas”和“types”节点是相互排斥和同义的:处理器不能允许在API定义的根级指定两者。我们建议使用“types”节点而不是“schemas”,因为模式别名已过时,可能会在将来的RAML版本中删除。

用户文档

The OPTIONAL documentation node includes a variety of documents that serve as user guides and reference documentation for the API. Such documents can clarify how the API works or provide technical and business context.
可选documentation节点包括各种文档,用作API的用户指南和参考文档。这些文档可以阐明API的工作原理或提供技术和业务上下文。

The value of the documentation node is a sequence of one or more documents. Each document is a map that MUST have exactly two key-value pairs described in following table:
文档节点的值是一个或多个文档的序列。每个文档都是一个映射,必须有下表中描述的两个键值对:

名称 描述
title 文档标题。它的值必须是非空字符串。
content 文档的内容。它的值必须是非空字符串,并且可以使用 markdown格式化。

This example shows an API definition having two user documents.
此示例显示具有两个用户文档的API定义。

#%RAML 1.0
title: ZEncoder API
baseUri: https://app.zencoder.com/api
documentation:
 - title: Home
   content: |
     Welcome to the _Zencoder API_ Documentation. The _Zencoder API_
     allows you to connect your application to our encoding service
     and encode videos without going through the web  interface. You
     may also benefit from one of our
     [integration libraries](https://app.zencoder.com/docs/faq/basics/libraries)
     for different languages.
 - title: Legal
   content: !include docs/legal.markdown

基本URI和基本URI参数

可选baseUri节点将URI指定为整个API的标识符,并且可以用于指定提供API的URL(其服务端点),并且其形成其每个资源的URL的基础。baseUri节点的值是必须符合URI规范 RFC2396模板URI.的字符串。

如果baseUri值是 模板URI,则以下保留的基本URI参数可用。

URI参数
version 根级版本节点的值

在baseUri中出现的任何其他URI模板变量可以在API定义根目录下的baseUriParameters节点中显式地描述。baseUriParameters节点与资源节点上的uriParameters节点具有相同的结构和语义,除了它指定基本URI中的参数,而不是资源的相对URI。

如果baseUri值是模板URI,则以下保留的基本URI参数可用。

#%RAML 1.0
title: Salesforce Chatter REST API
version: v28.0
baseUri: https://na1.salesforce.com/services/data/{version}/chatter

以下示例声明了一个显式基本URI参数。

#%RAML 1.0
title: Amazon S3 REST API
version: 1
baseUri: https://{bucketName}.s3.amazonaws.com
baseUriParameters:
  bucketName:
    description: The name of the bucket

当基本URI以一个或多个斜杠(/)结尾时,在使用该基本URI的资源的绝对路径中省略那些尾部斜线。例如,在以下代码段中,资源的绝对路径为http://api.test.com/common/usershttp://api.test.com/common/users/groups

baseUri: http://api.test.com/common/
/users:
  /groups:

在下面,更多复杂的例子,在多个地方连续的斜线,基本URI中只有尾部斜线被折叠,导致这些资源的绝对路径://api.test.com//common///api.test.com/common/users///api.test.com//common//users//groups//

baseUri: //api.test.com//common//
/:
  /users/:
    /groups//:

协议

可选协议节点指定API支持的协议。如果协议节点未被明确指定,则使用包括在baseUri节点中的一个或多个协议;如果协议节点被明确指定,则节点规范覆盖包括在baseUri节点中的任何协议。协议节点必须是非空的字符串数组,值为HTTP和/或HTTPS,并且不区分大小写。

以下是同时接受HTTP和HTTPS请求的API端点示例。

#%RAML 1.0
title: Salesforce Chatter REST API
version: v28.0
protocols: [ HTTP, HTTPS ]
baseUri: https://na1.salesforce.com/services/data/{version}/chatter

默认媒体类型

指定可选mediaType节点可设置具有正文的响应和请求的默认媒体类型。您不需要在每个主体定义中指定媒体类型。

mediaType节点的值必须是媒体类型字符串序列或单个媒体类型字符串。媒体类型适用于具有正文,预期响应和使用相同媒体类型字符串序列的示例的请求。每个值都需要符合 RFC6838中的媒体类型规范。

此示例显示用于接受并返回JSON格式的正文的API的RAML片段。如果此API规范的其余部分未明确指定另一种媒体类型,则此API接受并返回仅JSON格式的主体。

#%RAML 1.0
title: New API
mediaType: application/json

此示例显示用于接受和返回JSON或XML格式的主体的API的RAML片段。

#%RAML 1.0
title: New API
mediaType: [ application/json, application/xml ]

为API请求或响应的主体显式定义mediaType节点将覆盖默认媒体类型,如以下示例所示。资源/list返回表示为JSON或XML的Person []正文。资源/send通过显式地定义一个application/json节点来覆盖默认的媒体类型。因此,资源/send仅返回JSON格式的主体。

#%RAML 1.0
title: New API
mediaType: [ application/json, application/xml ]
types:
  Person:
  Another:
/list:
  get:
    responses:
      200:
        body: Person[]
/send:
  post:
    body:
      application/json:
        type: Another

默认安全

指定可选securedBy节点为API中的每个资源的每个方法设置默认安全方案并保护。节点的值是安全方案名称的数组。有关详细信息,包括如何通过继承解决多个安全方案的应用程序,请参阅应用安全方案 一节。

以下示例显示了允许通过OAuth 2.0安全方案或OAuth 1.1安全方案进行访问的API。

#%RAML 1.0
title: Dropbox API
version: 1
baseUri: https://api.dropbox.com/{version}
securedBy: [ oauth_2_0, oauth_1_0 ]
securitySchemes:
  oauth_2_0: !include securitySchemes/oauth_2_0.raml
  oauth_1_0: !include securitySchemes/oauth_1_0.raml
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容