2

我对使用 REST API 构建 Web 服务很感兴趣。我一直在阅读有关 HATEOAS 的文章,许多示例通过将其与人类在网上冲浪时的行为进行比较来解释该概念。这让我在想,为什么不以人类和机器都可以轻松使用的方式构建 REST API?

例如,我有一个小部件的内部模型,该小部件具有部件号、价格等属性。当机器请求小部件列表时,我可以返回一个 JSON 表示。

{
    widgets: [
        {
            id: 1,
            part_number: "FOO123",
            price: 100,
            url: "/widget/1"
        },
        {
            id: 2,
            part_number: "FOO456",
            price: 150,
            url: "/widget/2"
        },
        {
            id: 3,
            part_number: "FOO789",
            price: 200,
            url: "/widget/3"
        },
        ...
    ]
}

当一个人通过他/她的网络浏览器请求相同的列表时,似乎我应该能够采用相同的内部模型并对其应用不同的视图来生成 HTML 响应。(当然,我会用其他页面元素来装饰 HTML 响应,例如页眉、页脚等)

这是一个明智的设计吗?为什么或者为什么不?是否有任何流行的网站实际上正在这样做?

我看到的最大缺点是用户没有明显的方法来删除资源。在我的用例中,我不会让用户修改或删除资源,所以这不会破坏交易,但一般来说,你会如何处理呢?

4

4 回答 4

6

@mehaase

首先,我建议使用一种已注册的 JSON 超媒体格式:

它们都为创建具有语义链接关系的链接提供了显式语义。

例如,使用 Collection(.next)+JSON 你可以像这样表达你的小部件:

{"collection": {
  "version": 1.0,

  "items": [{
    "href": "/widget/1",

    "data": [{
      "name": "id",
      "value": 1,
      "prompt": "ID"
    }, {
      "name": "part_number",
      "value": "FOO123",
      "prompt": "Part number"
    }, {
      "name": "price",
      "value": 100,
      "prompt": "Price"
    }],

    "links": [{
      "rel": "self",
      "href": "http://...",
    }, {
      "rel": "edit",
      "href": "http://..."
    }]

  }]
}}

这为您提供了几个优势:

正如您从示例中看到的,它有足够的信息用于转换为 HTML(或其他格式)。

我看到的最大缺点是用户没有明显的方法来删除资源。在我的用例中,我不会让用户修改或删除资源,所以这不会破坏交易,但一般来说,你会如何处理呢?

对于这个阅读“编辑”链接关系规范,它意味着可以删除资源。

于 2012-06-01T15:49:16.337 回答
4

您可以做几件事,但第一个前提是现代“通用”网络浏览器确实是糟糕的 REST 客户端。

如果你的大部分交互都是由 JavaScript 保护和管理的,如果你编写一个“富客户端”,可以说你更多地依赖于 JS 生成的请求,而不是简单的链接、表单和后退按钮,那么它可能会更好REST 客户端。

如果您被表单和链接的通用浏览器体验所困扰,您可以通过重载 POST 来解决缺少其他 HTTP 动词的问题。你失去了中介机构的一些保证。DELETE 是幂等的,POST 不是,这会产生影响,但它不是毁灭性的,你只需要解决它。你可以用 POST 做幂等的事情,但中间人不会“知道”它们是,所以他们不能假设它是幂等的。

如果你最终不得不去“POST uber alles”,你要么将你的机器客户端限制在相同的 api 上,要么提供并行服务——那些被 POST 愚蠢的客户端使用的服务,以及其他对他们可用的全色域的服务。 .

也就是说,如果您选择基于 XML 的超媒体格式,那么您可以将 XSL 转换添加到 XML 有效负载中。浏览器将在有效负载上运行 XSL,创建一个你喜欢的漂亮页面(页眉、页脚、足够的 JS 来窒息马等),而机器将忽略它的这方面并只关注给定的数据。

在这方面为您提供“两全其美”。

于 2012-06-01T17:05:56.533 回答
1

您始终可以构建一个 REST API,然后围绕它构建您自己的人性化 Web 应用程序。这是一种常见的做法,因为您拥有开箱即用的功能和可供开发人员使用的可扩展系统。

于 2012-06-01T15:45:30.050 回答
0

只需使用带有 RDFa 的 HTML 就可以做到这一点。所以人类可以阅读 HTML,机器可以阅读 RDFa 注释。您需要一个像 hydra 这样的 REST 词汇来注释链接,并需要其他词汇,比如 schema.org 来注释内容。

为不同类型的客户端使用不同媒体类型的另一种选择,例如用于人类的 HTML 和用于机器的 JSON-LD。

于 2013-12-02T14:30:25.553 回答