首页 > 解决方案 > 我如何询问 REST 服务器它有哪些资源?

问题描述

假设我有一个https://50281ac6-ece9-42d3-9590-8e3325f50bd9.mock.pstmn.io/带有两个端点的 REST 服务器,spaceballs/raspberry并且spaceballs/technician. 这些端点将使用包含来自 Spaceballs 的引号的正文响应 HTTP GET 请求,例如

curl -X GET "https://50281ac6-ece9-42d3-9590-8e3325f50bd9.mock.pstmn.io/spaceballs/raspberry"
Only one man would dare give me the raspberry!

curl -X GET "https://50281ac6-ece9-42d3-9590-8e3325f50bd9.mock.pstmn.io/spaceballs/technician"
We got the bleeps, sweeps and the creeps!

所以一切都很好,但是如果我不知道这两个端点,只知道 RESTful 服务器的 URL 怎么办?我怎么能问那个(在这种情况下是模拟的)服务器它有什么资源?

标签: restapiendpoint

解决方案


作为客户端,您不必知道这两个端点!这是 REST 的基本原则之一,您的资源应该是可发现的。

了解用户的端点https://50281ac6-ece9-42d3-9590-8e3325f50bd9.mock.pstmn.io/应该能够使用超媒体浏览 API。实际上,这意味着您的入口点会返回指向其他相关资源的链接。因此你应该有这样的东西;

GET https://50281ac6-ece9-42d3-9590-8e3325f50bd9.mock.pstmn.io/

{
  "self": {
    "type": "link.list",
    "uri": "/",
    "href": "https://50281ac6-ece9-42d3-9590-8e3325f50bd9.mock.pstmn.io/"
  },
  "links": [
    {
      "rel": "film",
      "type": "link.list",
      "href": "https://https://50281ac6-ece9-42d3-9590-8e3325f50bd9.mock.pstmn.io/spaceballs"
    }
  ]
}

上面的响应告诉客户端当前 URI 是一个链接列表,并且有一个链接(称为“电影”)到 host/spaceballs 上的另一个资源,并且该资源也是一个链接列表。使用此信息,客户端可以调用该 API;

GET https://50281ac6-ece9-42d3-9590-8e3325f50bd9.mock.pstmn.io/spaceballs

{
  "self": {
    "type": "link.list",
    "uri": "/spaceballs",
    "href": "https://50281ac6-ece9-42d3-9590-8e3325f50bd9.mock.pstmn.io/spaceballs"
  },
  "links": [
    {
      "rel": "quote",
      "type": "film.quote",
      "href": "https://https://50281ac6-ece9-42d3-9590-8e3325f50bd9.mock.pstmn.io/spaceballs/raspberry"
    },
    {
      "rel": "quote",
      "type": "film.quote",
      "href": "https://https://50281ac6-ece9-42d3-9590-8e3325f50bd9.mock.pstmn.io/spaceballs/technician"
    }
  ]
}

您现在已经使用超媒体来描述应用程序的状态,并且正在编写 REST API!这是非常非常重要的一点。诸如此类的描述性链接不是“值得拥有”的——它们是必需的。如果你的 API 不能像这样工作,那它就不是 REST。


推荐阅读