繁体   English   中英

RESTful API应该执行哪些操作?

[英]What operations should a RESTful API have?

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

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

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

特别是我想知道是否应该通过名称/年龄/颜色来确定要寻找绵羊的路线,以及在最佳实践中如何处理该路线。

我可能缺少信息,但是在上面的教程中,通过id查找绵羊的途径是"/sheeps/:sheepId" 我该如何寻找按名称查找的路线? 如果我执行"/sheeps/:sheepName" ,那么通过id查找羊就不一样了,因为如果我转到浏览器并进入例如: "localhost:8080/sheeps/someNameOrId" ,浏览器或客户端将如何边识别出它是名称还是ID?

我正在以AngularJS作为客户端,如果那可以帮助建立更有用的答案。

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

对于您的情况,您需要执行CRUD byId或byName,然后需要将REST资源写为“ / sheeps / id /:sheepID”或“ / sheeps / name /:sheepName”。

首先,尽管REST有其标准和最佳实践,但它不是协议。 因此,人们可能会针对问题提出不同的解决方案,并且从他们自己的角度来看,他们可能都是正确的。

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

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

从语法上讲,它们都很好。 现在,如果我们认为不必太关注REST一词,就会发现在这两种选择中,API的性能都将是相同的。 因此,更多的是关于可读性,这意味着哪个选项可以更好地了解我们在做什么。 我认为在这两种情况下,程序员都将很容易理解我们在做什么。

因此,如果只有一种选择是正确的想法就摆脱,然后选择您认为更好的选择。

在上述实现中要注意的另一件事是,当您执行搜索时(例如/ sheeps?sheepId ='123'),并且如果找不到与参数匹配的内容,则最好传递204 No Content。 如果是/ sheeps / {sheepId},则应为404 Not Found。 在您的情况下,什么更有意义? 根据您的理解选择。

这是因为SheepId和SheepName冲突。 现在,由于需要按名称/年龄/颜色来获取绵羊,以下方法似乎非常合乎逻辑。

  • /羊?年龄= '5'
  • /羊?颜色=“黑”
  • ?/羊年龄= '5';颜色= '黑'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM