RESTful API应该具有哪些操作?

时间:2017-06-12 05:42:07

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

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

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

除了我从this tutorial看到的基本CRUD操作,比如创建一只绵羊,通过id读一只羊,用id更新一只羊,然后通过id删除一只羊我应该在我的api中包含其他操作?

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

我可能缺乏信息,但通过上面的教程,通过id查找绵羊的路线是"/sheeps/:sheepId"。我如何通过名字找到路线?如果我做"/sheeps/:sheepName"那就不一样了,因为如果我去我的浏览器并且例如:"localhost:8080/sheeps/someNameOrId",浏览器或特别是客户端如何识别是否是姓名还是身份证?

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

2 个答案:

答案 0 :(得分:0)

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

在你的情况下,你需要做CRUD byId或byName,然后你需要把你的REST资源写成“/ sheeps / id /:sheepID”或“/ sheeps / name /:sheepName”。

答案 1 :(得分:0)

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

现在回答你的问题,原则上uri应该代表你想要进行操作的资源。它可能有也可能没有搜索,过滤等的查询参数。 因此,表示/ sheeps / {sheep id / name}对于绵羊来说是完美的。现在,对于您的问题陈述,下面可能是有效的RESTful实现方式:

  
      
  • / sheeps?sheepId ='123'和/ 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'
  •   
  • /羊?颜色= '黑'
  •   
  • /羊年龄= '5';颜色= '黑'
  •