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'
我是 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'