如果我不使用它们,是否需要将路径参数放入 URI [REST API]

Do i need to put path params in an URI if i don't use them [REST APIs]

我正在和工作中的一位学长辩论,我想知道他说的是否属实。假设我有一条路径 /users/bucket-list 获取当前登录的用户存储桶列表。现在我的问题是,既然我从上下文中获得了登录用户的 ID,我是否仍然需要像这样命名我的路径 /users/:user_id/bucket-list。我不使用路径参数,但我的前辈认为它应该仍然存在,我认为既然我不使用它,我就需要省略它。我想听听你对此的看法。

TL;博士

  • 你“做错了”
    • 大多数时候,你会侥幸逃脱
      • 侥幸逃脱是错误的目标

Any information that can be named can be a resource -- Fielding, 2000

在大多数情况下,我发现对“资源”进行推理的最简单方法是用“文档”代替,然后在基本思路到位后在必要时进行概括。

我们在创建 API 时面临的设计问题之一是弄清楚我们的资源; “Alice 的 bucket-list” 应该与“Bob 的 bucket-list” 分开显示,还是应该放在一起?我们是为整个列表提供一种资源,还是为列表中的每个条目提供一种资源,等等。

我们在设计中需要考虑的一个相关问题是资源应该支持多少表示。这可能包括选择支持多种文件格式(csv 与 plain-text 与 json 等)和不同语言(EN 与 FR)等。

学长提议的设计类似于拥有两种不同的资源。完成后,一切都会正常工作 [tm]。识别哪个资源不会混淆,授权与识别完全分开,等等。

但是,您的设计类似于具有多个表示的单个资源,其中根据查看者来选择表示。这有点混乱——当然您的服务器可以解释 HTTP 请求,但通用组件不会知道您的资源与 Internet 上的所有其他资源具有不同的标识语义。

我们通常使用 Vary header 来区分不同的表示;但是 Authorization 字段有点超出范围,请参阅 RFC 7231

在实践中,您可能会逃避您的设计,因为我们有关于如何 shared-caches 与经过身份验证的请求交互的特殊规则,请参阅 RFC 7234

但是“可能逃过一劫”是相当薄弱的。拥有共同标准的目的是获得互操作性。如果你要冒互操作的风险,你最好得到一些非常有价值的东西作为交换。您在此处提供的任何内容都没有暗示补偿优势。