在 REST API 中使用 URL 而不是 id 真的实用吗

Is it really practical to use URLs instead of ids in a REST API

REST APIs 的正确设计似乎是一个有争议的话题。据我所知,关于 ids 的纯粹主义方法是 URL 是 outside 世界的唯一资源 identifier,因此客户端也不是必须以任何方式解释 URL(例如,知道最新的段是 id),也不必将 id 显式包含在为简单 GET 请求返回的表示中。

乍一看,这似乎是一个很好的规则,因为客户端不必关心根据 id 生成 URLs,这只是一回事。 id 告诉您如何检索资源。但是,我怀疑这在实践中是否真的适用。我想到的一些问题:

它只是将太多信息放入了一个不属于那里的 id,因为 ide 不应该被任何消费者以这种方式解释。

这在实践中真的做到了吗?是否有流行的 public API 应用此模式的示例?又或许我理解不正确,这不是 REST 纯粹主义者提倡的?

看看 Hypermedia Driven RESTFul APIs。在 HATEOAS 中,URI 是可发现的(且未记录),因此可以更改它们。也就是说,除非它们是您系统的入口点(Cool URIs, the only ones that can be hard-coded by clients) - and you shouldn't have too many of those if you want the ability to evolve the rest of your system's URI structure in the future. This is in fact one of the most useful REST 的特性。

对于剩余的非酷 URI,它们可以随着时间的推移而改变,并且您的 API 文档应该说明它们应该在运行时通过超媒体遍历被发现的事实。

查看 Richardson's Maturity Model (level 3), this would be where links come into play. For example, from the top level, say /api/version(/1), you would discover there's a link to the groups. Here's how this could look in a tool like HAL Browser:

根目录:

{
  "_links": {
    "self": {
      "href": "/api/root"
    },
    "api:group-add": {
      "href": "http://apiname:port/api/group"
    },
    "api:group-search": {
      "href": "http://apiname:port/api/group?pageNumber={pageNumber}&pageSize={pageSize}&sort={sort}"
    },
    "api:group-by-id": {
      "href": "http://apiname:port/api/group/{id}" (OR "href": "http://apiname:port/api/group?id={id}")
    }
  }
}

这里的优点是客户端只需要知道关系 (link) 名称(显然除了资源 structure/properties 之外),而服务器大部分时间都可以自由更改关系(和资源)url.