我知道REST端点应该是名词而不是动词,但有时会允许轻微的偏差吗?
想象一下应该发布产品的端点(让它在网页上可见,也许可以在队列中添加内容)。
我可以提出两种解决方法。
1)PUT api / products / 1 / publish - 我喜欢它,因为它是显式的,避免后端的复杂性并且它自己记录。
2)PATCH / PUT / PATCH api / products / 1
{
"color": "green",
//some properties removed for brevity
"ispublished" : true
}
第二种方法要求后端服务跟踪帖子正文上的isPublished字段,当它转换为true时,启动发布过程。这感觉更复杂,维护更多。
所以我的问题是,从REST的角度来看,使用第一种方法是否可以?是否有一些重大缺点?
答案 0 :(得分:2)
技术上根据RPC样式,没有什么可以阻止您在URL中使用动词。 从概念上来说并不是应该如何设计REST。
REST代表重新表示 S tate T 转移。此架构风格为resource-oriented且与协议无关,但经常通过HTTP协议实现。
通过HTTP协议实现REST应用程序时,资源由URI标识,而此类资源上的操作由HTTP methods表示(不需要任何其他动词)。要更改资源的状态,您应该向服务器发送资源的新状态的表示。表示可以是JSON,XML或能够表示资源状态的任何其他格式。请参阅以下引文:
REST组件通过使用表示来捕获资源的当前或预期状态并在组件之间传输该表示,从而对资源执行操作。表示是字节序列,加上用于描述这些字节的表示元数据。其他常用但不太精确的表示名称包括:文档,文件和HTTP消息实体,实例或变体。
[...]给定的表示可以指示所请求资源的当前状态,所请求资源的期望状态或某些其他资源的值[...]
遵循此方法,product
资源可以具有status
子资源。根据您的需求,status
可以有不同的值,例如draft
,published
,inactive
......
然后使用PUT
将status
子资源的状态替换为请求有效负载中发送的JSON:
PUT /api/products/1/status HTTP/1.1
Host: example.org
Content-Type: application/json
{
"value" : "published"
}