【问题标题】:RESTful URI trailing slash or no trailing slashRESTful URI 尾部斜杠或没有尾部斜杠
【发布时间】:2020-05-01 16:58:43
【问题描述】:

当谈到 Restful URI 上的尾部斜杠时,我可以引用一个权威的立场吗?罗伊菲尔丁的一位会很棒。网络在这两个方面都有权威意见。这两个位置是: 尾随斜杠表示资源,而没有则没有。另一个论点是斜杠没有语义价值。它是哪一个? 示例:

  @GetMapping(path = "/users/")
  public List<User> getUsers() {
   ....
  }

  @GetMapping(path = "/users/{id}")
  public User getUser(@PathVariable String type)  {
   .....
  }

  @PutMapping(path = "/users/")
  public User updateUser(@RequestBody User user) {
   ....
  }

  @PostMapping(path = "/users/")
  public User createUser(@RequestBody User user) {
   ....
  }

  @DeleteMapping(path = "/users/{id}")
  public void deleteUser(@PathVariable Long id) {
   ....
  } 

是否应该删除尾部斜杠?

【问题讨论】:

    标签: rest restful-url


    【解决方案1】:

    以下网址:

    http://example/foo
    http://example/foo/
    

    不是同一个网址。缓存将它们分开存储。因此,从这个意义上说,确实存在差异。规范化 URL 不会删除它们。

    每个 URI(是否以斜线结尾)都会指向一个资源。

    据我所知,也没有具体的推荐使用。一些协议(例如 WebDAV)使用它来建议以斜杠结尾的 URL 暗示它是一个集合。

    以斜线结尾的一个小好处是文档中的相对 URL(不以斜线开头)将引用集合中的项目。利用这一点意味着客户端需要正确解析相对 url,这并不总是正确的。

    我见过的大多数 API 都不以斜线结尾。对某些人来说,以斜线结尾(并要求这样做)可能是令人惊讶的行为。

    没有官方来源,因为我认为它们不存在。我对标准有相当深入的了解,所以我对此很有信心。

    【讨论】:

    • 我同意,但不幸的是,有些人在这方面有强烈的意见,我厌倦了以一种或另一种方式更改代码。我个人在这场战斗中没有狗。
    • @Stephen,坦率地说,这听起来像是制表符与空格的事情;)如果这让您的公司感到悲伤,我的感觉是这是一个文化问题,而不是技术问题。
    • 当服务器想要(需要)发回包含相对引用路径的 HTTP 位置时,这变得相关,例如在对集合的 POST 的响应中,以及 201 Created。例如 'POST: example.com/users' 与我们的不带斜杠,您将返回一个位置 'users/123' 或仅返回 '123',具体取决于 URI 的结尾斜杠 ``` 对于第二个 ``` 位置: 123```en.wikipedia.org/wiki/HTTP_location
    【解决方案2】:

    当涉及到 Restful URI 上的尾部斜杠时,我可以引用一个权威的立场吗?

    URI 的权威引用是RFC 3986。第 3.3 节包括段的产生式规则。

    /users
    

    此 URI 有一个路径 /users,其中包括一个段:“用户”

    /users/
    

    此 URI 有一个路径 /users/,其中包括两个段:“用户”和 一个空段

    REST 客户端应将 /users/users/ 视为两个不同的标识符 - 例如,每个标识符都有不同的缓存条目。

    REST 没有就何时使用这两种方法或何时选择同时使用两种方法提供任何意见。这是重点的一部分,授权机构(服务器)可以以任何它喜欢的方式将 URI 分配给资源。就其他人而言,标识符是不透明的。

    这意味着您使用的 URI 拼写只需要符合本地拼写约定。

    Rails Routing from the Outside In 描述了您可能在本地采用的一种可能的约定:“集合”使用一个分段拼写,而集合的成员使用两个分段拼写。

    使用该约定/users 将引用集合,而/users/,据我所知,不会被使用。

    在一个成员有空 id 有意义的域中,那么我们可能期望该成员具有标识符 /users/

    【讨论】:

    • 我同意似乎没有关于斜杠的官方规范。从几年前开始,有人反对将斜杠作为标准。当您在概念上拥有像我的“用户”示例这样的资源时,当时似乎 DeFacto 标准也是斜杠。这样一来,一切都是“用户”之后的斜线。所以:“Put Post and Get (get all), Delete (delete all)”语法一致。我试图确定这种推动来自哪里,为什么?这是最直接的胜利案例吗?
    猜你喜欢
    • 2018-04-08
    • 2013-02-28
    • 1970-01-01
    • 2012-01-06
    • 1970-01-01
    • 1970-01-01
    • 2018-05-01
    • 2015-06-20
    相关资源
    最近更新 更多