2017-10-16 55 views
0

我需要通过REST调用创建和删除两个不同实体之间的关系。假设用户A(当前用户)要跟随或不跟随用户B.跟随关系的存在由跟随关系实体的存在或不存在表示(Follow(B,A)表示A遵循B)。正确的REST调用URI来创建和删除两个实体之间的关系

应该调用是:

POST /api/follow/{user-b-id} // to follow 
and 
DELETE /api/follow/{user-b-id} // to un-follow 

,其中用户A的身份是从一起发送到验证调用的标记推断。

还是应该立足于行动正在开展:

POST /api/follow/{user-b-id} // to follow 
and 
POST /api/unfollow/{user-b-id} // to un-follow 

我有疑虑哪些方法(POST,PUT,DELETE等)使用,这些URI是否应引用动作(动词?)正在执行。由于我正在重新设计一个API,因此我希望尽可能接近“正确”(是的,我认识到这是一个小主观)REST API设计,这对我的项目很有意义。

+0

“unfollow”动作是否有其他副作用? – inovaovao

+0

截至目前,唯一的副作用是几个分片计数器的减量(B的跟随者计数,跟随A的计数)。 – markvgti

回答

1

正确的URI的REST调用来创建两个实体

之间&删除关系

REST不关心你使用什么拼写为您的URI;就REST而言,/182b2559-5772-40fd-af84-297e3a4b4bcb是一个完美的查找URI。对拼写的限制不是来自REST,而是任何本地编码标准。

一个通用的标准是考虑一个集合资源,其中包括项目;以便通过向集合资源发送消息来建模将项目资源添加到集合,并且通过向项目资源发送消息来建模删除项目资源。例如,Atom发布协议以这种方式工作 - 一个POST to a collection resource添加一个新条目,一个DELETE to the item resource删除该条目。

遵循这种方法,通常的指导方针是集合资源被命名为集合,其中的资源从属于它。

// Follow 
POST /api/relationships 

// Unfollow 
DELETE /api/relationships/{id} 

id这里可能是user-b-id,也可能是别的东西; REST的核心思想之一是服务器是其URI空间的权威;服务器可以根据自己的意愿将信息嵌入到URI中,并用于自己的专用。预计消费者将标识符视为不透明单元。

我怀疑要使用哪些方法(POST,PUT,DELETE等)以及URI是否应引用正在执行的动作(动词?)。

即使正在使用的主要媒体类型(HTML)仅支持本地GET和POST,有时候请记住万维网已经爆炸性地成功。

从技术上讲,您可以使用POST来处理所有事情。该HTTP uniform interface给你全权委托。

PUTDELETEPATCH都可以考虑POST专业:unsafe方法与额外的语义。 PUT暗示幂等替换语义,DELETE建议删除,PATCH全部或全部更新。

引用动作不(REST不关心拼写,记不清了),但它确实表明,你都在思考的效果的消息的,而不是对资源的消息正在采取行动。

JSON Patch可能是一个有用的例子,要记住。将operations(添加,删除,替换等)编码到补丁文档中,URI指定应使用那些操作修改哪些资源。

Jim Webber这种方式表达了这个想法-HTTP是一个文件传输应用程序。有用的工作是交换文件的副作用。 URI标识用于导航集成协议的文档。

因此,如果您需要为您的URI使用一致的,人类可读的拼写,则实现此目的的一种方式是通过阐明该协议及其组成的协议和文档。

如果说修改实体(资源)属性的子集,PUT是用于替换整个实体(资源)和修补程序是否正确?

不完全。 PUT意味着请求的消息主体是资源的替代表示。 PATCH表示请求的消息主体是补丁文档。

语义中没有任何内容阻止您使用PUT更改大文档中的单个元素,或者使用PATCH完全替换表示。

但客户端可能更喜欢PATCH到PUT,因为补丁文档比替换表示小得多。或者它可能更喜欢PUT到PATCH,因为消息传输是不可靠的,并且PUT的幂等语义使得重试更容易。

+0

如果说'PUT'用于替换整个实体(资源)和'PATCH'实体(资源)属性的子集? – markvgti

1

正确的决定还取决于项目中其他资源的映射方式。相同的风格比较好,但是如果没有偏好,下面可能有被更容易的优势,实现和记

POST /api/follow/{user-b-id} // to follow 
and 
POST /api/unfollow/{user-b-id} // to un-follow 
+0

从头开始重新设计,因此为了保持一致性,没有其他资源映射需要考虑。 – markvgti

+0

在这种情况下,也许其他选项更适合,因为它更接近'正确'RESTful设计 –

1

我会说,如果您传递关系的id/link/follow从a到b,则使用删除动词。这样,你的路线正在做的很清楚。它接受某个对象的id并将其删除。

但是,在你的例子中,你传递了另一个用户的id,那么你必须做一些逻辑来找到两者之间的关系/链接/关注对象并将其删除。在我看来,这是一个比删除更重要的职位,因为你需要做额外的工作。无论如何,这似乎是相当主观的,哪一个是“正确的”,

相关问题