在REST中,如何处理不适合Get,Post,Put或Delete的资源的操作

时间:2014-06-17 16:27:30

标签: rest

所以我想创建一个评论系统,它的端点类似于:

mysite.com/comments/12345

因此,我希望创建评论的用户能够关闭评论,这会阻止对评论的任何其他回复。我们只是说服务器方法将命名为"关闭"。

我的问题:

  • 网址是什么样的?
  • 身体包含什么? (我假设它需要包含一些方法来验证提交操作的用户是谁,但它是否包含任何其他信息,例如commentid?)
  • 我使用什么Http Verb?

我可能会使用ASP.Net Web API作为平台,虽然这是REST,所以我认为这应该与解决方案无关。

2 个答案:

答案 0 :(得分:1)

可能的解决方案是添加一个字段“关闭”。或类似的 您可能已经有一个字段userauthor或类似的字段,用于指定执行请求的人员。

所以当你创建评论时

POST mysite.com/comments HTTP/1.1

{
  "body": "hey sway",
  "user": "John",
  "closed": "no"
}

这是使用JSON,只是一个例子,我不知道你的服务器是如何实现的,但这并不重要。

然后,关闭'评论你将对该资源进行PATCH(部分更新)

PATCH mysite.com/comments/12345

{
  "closed": "yes"
}

根据服务器的实现方式,仅提供需要更新/编辑的字段就足够了。但是,因为您只希望评论的创建者能够将其关闭,所以您应该在请求中包含user

PATCH mysite.com/comments/12345

{
  "user": "John"
  "closed": "yes"
}

上面的示例假定创建的评论的资源ID为12345,如您的示例所示。

然后在服务器上,您可以检查是否允许John关闭评论。


总结一下

  

网址是什么样的?

网址与GET

相同
  

身体含有什么?

需要更新/修改的所有字段以及user

  

我使用什么Http Verb?

PATCH在这里最有意义,因为您正在部分更新资源。

答案 1 :(得分:0)

如果关闭评论的信息是资源的一部分,您可以PUT新资源版本:

PUT /comments/12345 HTTP/1.1

{
  "id" : "12345",
  "content" : "something",
  "replies" : [ "foo", "bar" ],
  "closed" : true
}

根据HTTP Specification,您必须PUT整个资源:

  

如果Request-URI引用已存在的资源,则为   封闭实体应该被视为该实体的修改版本   驻留在原始服务器上。

如果您不想发送整个资源,可以使用PATCH

PATCH /comments/12345 HTTP/1.1

{ 
  "op" : "replace", 
  "path" : "/closed", 
  "value": true 
}

有关详细信息,请参阅JSON Patch draft

您还可以使用POST来更新资源。已经有很多关于此问题的讨论,例如hereherehere