【问题标题】:What operations should a RESTful API have?RESTful API 应该具备哪些操作?
【发布时间】:2017-11-13 11:55:59
【问题描述】:

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

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

除了我从this tutorial 看到的基本 CRUD 操作,例如创建绵羊、按 id 读取绵羊、按 id 更新绵羊和按 id 删除绵羊,我的 api 中还应该包含其他操作吗?

我特别想知道是否应该制定路线,例如按名称/年龄/颜色寻找羊,以及在最佳实践中我将如何处理路线。

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

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

【问题讨论】:

    标签: angularjs node.js rest api restful-architecture


    【解决方案1】:

    首先,虽然 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 冲突。现在对于按名称/年龄/颜色获取羊的要求,下面的方法似乎很合乎逻辑。

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

    【讨论】:

      【解决方案2】:

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

      在您的情况下,您需要按 ID 或按名称执行 CRUD,然后您需要将 REST 资源编写为“/sheeps/id/:sheepID”或“/sheeps/name /:sheepName”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-26
        • 2015-01-19
        • 1970-01-01
        • 2020-08-17
        相关资源
        最近更新 更多