【问题标题】:Good URL syntax for a GET request with a composite key具有复合键的 GET 请求的良好 URL 语法
【发布时间】:2019-07-11 20:09:30
【问题描述】:

让我们在我的 REST API 中使用以下资源:

GET `http://api/v1/user/users/{id}`

在正常情况下我会这样使用:

GET `http://api/v1/user/users/aabc`

aabc 是用户 ID。

但是,有时我不得不设计我的 REST API,以便通过 ID 传递一些额外的信息。例如:

GET `http://api/v1/user/users/customer:1`

customer:1 表示我正在使用客户域中的 id 来查找用户,并且该 id 为 1。

我现在有一个标识符是多个键(复合键)的场景。例如:

GET `http://api/v1/user/users/customer:1;type:agent`

我的问题:在上面的 URL 中,customer:1type:agent 之间的分隔符应该使用什么?

根据https://www.ietf.org/rfc/rfc3986.txt,我认为分号是不允许的。

【问题讨论】:

  • 为什么不使用查询参数,例如/v1/users?customerId=1&type=agent/user/users 似乎很可疑,自己编造代表通常不是一个好主意。
  • 尝试对您的 URL 进行编码。
  • 我在考虑这个问题,我认为这个问题更多是关于当你的资源 id 是复合键时该怎么做

标签: rest url


【解决方案1】:

与其尝试创建一个通过多个键同时访问记录的通用结构,我建议尝试更多地根据具体情况考虑这一点。

以您的示例为例,一种解释方式是您有多个客户,而这些客户可能各自拥有多个用户帐户。一个自然的层次结构是:

/customer/x/user/y

通常可以做出这样一个优雅的决定,这不仅可以解决问题,而且还可以记录您的数据模型,以便人们可以通过一对多的关系轻松地看到用户属于客户。

【讨论】:

    【解决方案2】:

    您应该:

    使用参数: 获取http://api/v1/user/users?customer=1

    或使用新网址: 获取http://api/v1/user/users/customer/1

    但请使用 this 之类的标准

    ("一般来说,路径往往会被缓存,而参数往往不会被缓存。")

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-20
      • 2023-03-20
      • 2019-05-28
      • 2021-04-15
      • 2019-03-10
      • 2018-06-14
      相关资源
      最近更新 更多