通过一个例子理解REST

通过一个例子理解REST,rest,Rest,我唯一真正接触到的是RubyonRails的思想。这非常适合我使用Rails构建的基于CRUD的应用程序,但因此我对RESTfusion的理解有点有限 假设我们有一个有限的项目集合,每个项目都有一个唯一的ID,以及一些属性,例如颜色、形状和大小(对于某些项目可能未定义) 项目可以由客户端使用一段时间,但每个项目一次只能由一个客户端使用。对项目的访问由服务器管理。客户端可以从服务器请求临时使用某些项 通常,客户只对访问具有特定属性的多个项目感兴趣,而不是访问特定项目 当客户机请求使用多个项目时,

我唯一真正接触到的是RubyonRails的思想。这非常适合我使用Rails构建的基于CRUD的应用程序,但因此我对RESTfusion的理解有点有限


假设我们有一个有限的项目集合,每个项目都有一个唯一的ID,以及一些属性,例如颜色、形状和大小(对于某些项目可能未定义)

项目可以由客户端使用一段时间,但每个项目一次只能由一个客户端使用。对项目的访问由服务器管理。客户端可以从服务器请求临时使用某些项

通常,客户只对访问具有特定属性的多个项目感兴趣,而不是访问特定项目

当客户机请求使用多个项目时,服务器将使用与请求相对应的ID列表进行响应,或者使用表示请求的项目当前不可用或不存在的响应进行响应

客户端可以发出以下类型的请求:

  • 告诉我有多少绿色三角形项目(总计/可用)
  • 给我200件大红色物品的用法
  • 我已经完成了第21、23、23项
  • 添加100个新的红方块项目
  • 删除50个绿色小项目
  • 将所有大黄色五角大楼项目修改为蓝色


上面的玩具示例就像我最近不得不处理的一个资源分配问题。我应该如何以RESTful的方式考虑它?

如果资源锁定在您的场景中确实是一个域问题,那么我建议将锁建模为资源

以下是一些建议,告诉你如何处理你提出的请求

GET /Triangle/Green/Count
GET /Triangle/Green/Available

POST /Item/Red/Large/Locks?quantity=200

DELETE /Item/21/Lock
DELETE /Item/23/Lock
DELETE /Item/25/Lock

POST /Square/Red?quantity=100

DELETE /Item/Green/Small?quantity=100

POST /Pentagon/Blue?url=/Pentagon/Yellow

话虽如此,定义URL有些不相关。使用适当的链接关系设计媒体类型是RESTful设计的关键部分。

理解的诀窍是从关注名词而不是动词来思考问题

在其他世界里,动词都是“预设”的,名词变得无限灵活。在soap或roc世界中,动词具有无限的灵活性。把你的思维限制在锁定动词上,然后看看你需要什么名词来解决你的问题

这正是darrel在上面的回答中所做的-他为锁编了一个新名词,可以满足您的约束,然后设置对它们的访问以实现您想要的


您的一些问题与搜索或筛选相关-对于那些考虑根据资源类型获取的问题,请输入查询参数以限制或筛选结果。

阅读此部分了解基本知识。。。我被困在什么是休息

内容管理系统可能包含一组文章。这里隐含着两种资源。首先是个别文章。每个构成一个资源。还有第二个资源:文章集

为了获取所有文章的列表,我们可以对这个集合发出一个HTTPGET请求,比如在path/articles上。要获取单个资源的内容,我们必须识别它。Rails的方法是给出它的主键值(即它的id)。我们再次发出GET请求,这次是针对URL/articles/1。到目前为止,这一切看起来都很熟悉。但是,当我们想向我们的收藏中添加一篇文章时会发生什么呢

在非RESTful应用程序中,我们可能会发明一些以动词短语作为名称的操作:articles/add_article/1。在REST的世界中,我们不需要这样做:我们应该使用一组标准的动词来告诉资源应该做什么。要使用REST在集合中创建新文章,我们将使用指向/articles路径的HTTP POST请求,POST数据包含要添加的文章。是的,这与我们获取文章列表的路径相同:如果您发出一个get to,它将以列表响应,如果您向其发布文章,它将向集合中添加一篇新文章


更进一步。我们已经看到您可以检索文章的内容,对路径/articles/1发出GET请求。要更新那篇文章,您需要对同一URL发出HTTP PUT请求。而且,要删除它,您可以再次使用相同的URL发出HTTP delete请求。

+1好主意,锁作为资源——用名词而不是动词来思考(锁与锁事件)。