RESTful API设计 - 如何处理外键?

geo*_*ydv 7 rest

我正在设计一个RESTful API,我正在试图弄清楚如何显示和更新资源的外键.

让我有一个对象User,它有一个id,name和一个外键(多对一关系)到实体:Computer.

我在大多数在线示例中看到的内容:

GET/users/1

{
  id: 1,
  name: "Bob",  
  computer: "<url>/computers/5"
}
Run Code Online (Sandbox Code Playgroud)

我可以理解,它是另一个资源的链接.但是当你想为鲍勃选择另一台电脑时,你会怎么做?

PUT/users/1

{
  name: "Bob",
  computer: "<url>/computers/4"
}
Run Code Online (Sandbox Code Playgroud)

这感觉很奇怪.我也在考虑以下情况:假设必须实现API的人可以使用下拉列表为Bob选择计算机,并且应该选择当前的计算机,我需要id来执行此操作.我是否必须自己解析网址来切断身份证?

我不应该这样做是有原因的:

GET/users/1

{
  id: 1,
  name: "Bob",  
  computerId: 5
}
Run Code Online (Sandbox Code Playgroud)

PUT/users/1

{
  name: "Bob",
  computerId: 4
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*son 4

我很想在这里将 HATEOAS 正式化,并得到:

获取/用户/1

{
  links: [
    { rel: "computer", href: "/users/1/computers/5" },
  ],
  user: {
    id: 1,
    name: "Bob",
    computer: 5,
  }
}
Run Code Online (Sandbox Code Playgroud)

放置/用户/1

{
  name: "Bob",
  computer: 4,
}
Run Code Online (Sandbox Code Playgroud)

获取/用户/1

{
  links: [
    { rel: "computer", href: "/users/1/computers/4" },
  ],
  user: {
    id: 1,
    name: "Bob",
    computer: 4,
  }
}
Run Code Online (Sandbox Code Playgroud)

/computers/n如果您愿意的话,链接 URL 显然可以是这样。

这使得您的表示始终只是数据,并且 GET 的主体提供您的应用程序可以使用的 URL。这样,如果您更改 URL 层次结构(即从/computers/n到 )/users/m/computers/n),您不需要更改任何手动构造 URL 的客户端代码。