Amazon 选择 HAL 作为 AppStreamAPI 的媒体类型

  • Steve Klabnik
  • 王振峰

2014 年 3 月 27 日

话题:架构

Amazon 发布了新 API——AppStream API,可以使用它通过编程的方式管理托管在 Amazon AppStream 平台上的应用。Amazon 选择使用HAL 媒体类型构建了该 API。HAL 是一种具有简约超媒体特点的媒体类型,用于构建设备到设备之间的 API。在采用超媒体作为公共产品实现技术的大型企业当中,Amazon 是其中之一。

虽然在 API 领域中,超媒体 API 是一个很热的话题,但其倡导者也经常被问起一个问题,即它在现实世界中的适用范围。针对该技术曾经有过很多研究和讨论,超媒体 API 也是目前 API 生态系统的一小部分。Amazon 的 CEO,Jeff Bezos,以让他的团队使用 SOA 风格构建其产品而出名,最终打造了大量对内和对外的 API。这份对通过 HAL 实现超媒体技术的信任,而且出自一家科技大公司,足以使那些超媒体的支持者精神振奋。

但是超媒体社区当前需要解决一个问题,那就是如何描述超媒体。典型描述超媒体服务的方法是提供一种媒体类型定义,别无其他。但是该方法与其他架构风格明显不同,所以超媒体社区正努力寻找其他策略来弥补该差距。

AppStream API 团队通过四个主要部分来描述 API:头部值、错误码、顶级资源和链接关系。这与传统的 REST 风格服务有所不同,REST 风格服务专注于使用 HTTP 状态码、URL 和参数的组合。但是该方式与传统超媒体方式非常接近。在HAL 的讨论邮件列表里,HAL 用户在这里讨论 HAL 标准以及其用法,Andrés Freyría Cedeño 这样说道:

我对文档的直觉反应就是沿着这条线往下走,“如果超媒体 API 成为标准,这能充分描述超媒体 API”。基于目前的技术水平,我认为缺乏充分的可供开发人员使用的配套资源。

随着超媒体成为公认的 API 模式,我们看看这种趋势如何继续。

HAL 是一种媒体类型,IETF 正在将其标准化。HAL 最初由 Mike Kelly 创作,致力于向 XML 和 JSON 提供一种简单易懂的公约集合,用于描述资源对另一个资源的链接。

下面是 HAL 响应的样例,摘自标准草案:

{
    "_links": {
        "self": { "href": "/orders/523" },
        "warehouse": { "href": "/warehouse/56" },
        "invoice": { "href": "/invoices/873" }
    },
    "currency": "USD",
    "status": "shipped",
    "total": 10.20
}

HAL 定义了两个预留的顶级属性,links 和embedded。你可以从这里查看 _links。在上面的对象中,HAL 标准定义了链接的组成方式。在该样例中,你可以看到虚构的"订单"资源的链接,该“订单”链接到它所存储的仓库和与之相关联的发票。


感谢邵思华对本文的审校。

给 InfoQ 中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ)或者腾讯微博(@InfoQ)关注我们,并与我们的编辑和其他读者朋友交流。

架构