RESTful API 应该有哪些操作?

What operations should a RESTful API have?

我是 Express 和 api 的新手,我目前正在使用 Express 构建 RESTful API。例如,假设这是我的模型。

Sheep = {
 name: String,
 age: Number,
 color: String
}

除了我在 this tutorial 中看到的基本 CRUD 操作,比如创建 Sheep、通过 id 读取 Sheep、通过 id 更新 Sheep 以及通过 id 删除 Sheep,还有其他操作我应该包括在我的 api?

特别是我想知道我是否应该通过 name/age/color 为寻找一只羊制定路线,以及在最佳实践中我将如何处理这些路线。

我可能缺少信息,但根据上面的教程,通过 id 找到一只羊的路线是 "/sheeps/:sheepId"。我将如何创建按名称查找的路线?如果我这样做 "/sheeps/:sheepName" 会不会与通过 id 找到羊不一样,因为如果我去我的浏览器并去例如: "localhost:8080/sheeps/someNameOrId" 浏览器或特别是客户端如何识别它是否是一个名称或 ID?

我正在与 AngularJS 作为我的客户合作,如果这有助于构建更有用的答案。

你的是一个非常经典的案例,我们需要为每个操作编写RESTful资源。正如您所说的那样,REST 无法知道您传递的是 ID 还是名称。理想情况下,在这种情况下,您需要按资源对操作进行分组。

在您的情况下,您需要通过 Id 或 byName 进行 CRUD,然后您需要将 REST 资源写为“/sheeps/id/:sheepID”或“/sheeps /名称/:sheepName”。

首先,虽然 REST 有其标准和最佳实践,但它不是协议。因此,人们可能会针对某个问题提出不同的解决方案,并且他们在各自的意义上可能都是正确的。

现在回答您的问题,原则上 uri 应该表示您要对其执行操作的资源。它可能有也可能没有用于搜索、过滤等的查询参数。 因此,表示 /sheeps/{sheep id/name} 非常适合绵羊。现在对于您的问题陈述,以下可能是有效的 RESTful 实施方式:

  • /sheeps?sheepId='123' AND /sheeps?sheepName='Eve'
  • /sheeps/{sheepId} AND /sheeps/name/{sheepName}

在语法上它们都很好。现在,如果我们不过度关注 REST 这个术语,我们会发现在我们的两个选项中 API 的性能将是相同的。所以,它更多的是关于可读性,这意味着哪个选项可以更好地了解我们正在做的事情。我认为在这两种情况下,程序员都会很容易理解我们在做什么。

所以,如果认为只有一个选项是对的,就放弃,选择你认为更好的。

在上面的实现中要注意的另一件事是,当你进行搜索时,比如 /sheeps?sheepId='123',如果你没有找到与参数匹配的东西,你最好传递 204 No Content . 而在 /sheeps/{sheepId} 的情况下,它应该是 404 Not Found。 在你的情况下什么更有意义?根据自己的理解选择。

这是因为 sheepId 和 sheepName 冲突。现在对于 name/age/color 得到羊的需求,下面的方法似乎很合乎逻辑。

  • /sheeps?age='5'
  • /sheeps?color='black'
  • /sheeps?age='5';color='black'