如果资源不可用于请求的操作,那么HTTP状态代码应该是什么?

时间:2014-12-03 13:28:54

标签: api rest http http-status-codes

我正在开发一个RESTful API。我对在这种特定情况下设置HTTP状态代码感到困惑。我不确定我(服务器)应返回什么状态码。

让我们说我的应用程序具有以下用户功能,如果我已经关注用户并再次发送相同用户ID的关注请求,那么在这种情况下应该是来自服务器的HTTP状态代码。状态代码后面会出现一条错误消息,上面写着:"已经跟随用户。"

类似的场景可以考虑取消关注用户功能,如果我没有关注用户" A",我仍然发送请求取消关注用户" A",然后是什么HTTP状态码服务器应该返回错误消息,例如"不跟随用户取消关注"

当然,200响应代码似乎不适合我吗?或者是吗?

如果我在错误的堆栈交换站点发布了问题,请原谅我,我将它发布在stackoverflow站点只是因为它与REST API有关。

修改

从客户端用户需要将POST请求发送到URL:

http://www.myserver.com/api/follow/10

以及在服务器端提供请求之前用于身份验证的其他必要参数(如API密钥,正确的标头等)。

取消关注操作的类似网址为:

http://www.myserver.com/api/unfollow/10

现在,如果客户端发送跟随请求,我发送HTTP状态码200作为响应,即使他/她已经跟踪了ID为10的用户,即使他/她已经关注了用户ID 10。 ,以及状态代码(200)我发送的消息类似于"已经跟随用户"

不知怎的,我觉得这并不令人信服,因为没有创建/更新资源它应该返回错误消息,其中包含200以外的正确状态代码,可能是4XX中的一个,不确定。

5 个答案:

答案 0 :(得分:3)

422 Unprocessable Entity

在这个用例中,

422似乎是正确的HTTP状态代码。 422的描述说:

422(不可处理实体)状态代码表示服务器理解请求实体的内容类型(因此415(不支持的媒体类型)状态代码不合适),并且请求实体的语法是正确的(因此400(错误请求)状态代码是不合适的)但无法处理包含的指令。

答案 1 :(得分:1)

答案取决于您的API。您按照"跟随用户X"来描述API。或"取消关注用户Y"。这让我觉得你可能正在以RPC风格接近你的API设计,而不是专注于资源。

如果您的API使用REST,包括HATEOAS原则,那么4xx范围内的错误代码可能是合适的(但我建议在这种情况下反对它,见下文)。非常简短:HATEOAS意味着您的资源提供了可能的"操作"的链接。您可以在此处详细了解:http://restcookbook.com/Basics/hateoas/

除此之外,设计您的API"容错"似乎是一个好主意,即期望多次发送相同的请求(例如,因为用户不耐烦并且一次又一次地点击,或者浏览器崩溃并重新启动并重新打开所有以前的选项卡,或者......)。

我的个人意见和建议如下:

  • 关注用户X :您的实施应检查是否需要添加新关注者。无论如何,如果用户已经关注或不关注,请发回HTTP状态201(已创建)并添加"位置"指向资源的HTTP标头。
  • 取消关注用户X :您的实施应检查是否需要删除关注者。无论如何,如果用户已经从关注者中删除,请发回HTTP状态200(确定)。

一般的想法是,如果客户端请求某种方式并且已经是这种情况,则服务器有两个选项:它响应客户端"您希望的结果已经到位。因此,您的请求无效。"或者服务器可以响应"您希望的结果已经到位。你有你需要的一切。"。 使用第二个选项可以使API更加宽容,并有助于幂等性(参见http://restcookbook.com/HTTP%20Methods/idempotency/)。

答案 2 :(得分:1)

我认为djlauk的答案涵盖了很多,但我想提出一些不同的方法并添加一些信息:

不要在URI中使用动词

我不会在/follow/ /unfollow/个URI上使用POST,因为这不是非常RESTful,请看这个问题:Why does including an action verb in the URI in a REST implementation violate the protocol?并且escpacially这个SO回答:How to create REST URLs without verbs?

对动作使用正确的HTTP动词

你想要做的是创建一个实体("关注")所以你可以使用HTTP动词POSTPUT然后删除它实体("取消关注"),其中DELETE是合适的。

我的API方法:

我会做以下事情:

(前两个例子仅用于解释结构,如果您不需要它们,则不必实施它们。)


这确实可以让你成为用户"罗伯特":

GET http://www.myserver.com/api/users/robert/

回复:#200


这确实可以让你的用户"罗伯特"如下:

GET http://www.myserver.com/api/users/robert/following/

回复:#200


这就是你让罗伯特"关注" rahul":

PUT http://www.myserver.com/api/users/robert/following/rahul

回复:#200

如果您再次发送此请求,则会得到相同的响应: #200 ,因为PUT是幂等的,这就是它的行为方式(参见(2)


当你现在想要让罗伯特"取消关注" rahul"你发送:

DELETE http://www.myserver.com/api/users/robert/following/rahul

回复:#200

如果再次发送DELETE请求,您会得到一个与 #404 不同的响应,但这是HTTP标准,客户应该理解这一点。


对于HTTP方法的常规答案代码,我也可以推荐此来源:restapitutorial.com

答案 3 :(得分:0)

我会使用以下某些内容:

System.Net.HttpStatusCode.ServiceUnavailable;
System.Net.HttpStatusCode.MethodNotAllowed;
System.Net.HttpStatusCode.BadRequest;

如果它是前两个中的一个,那就更好了。

答案 4 :(得分:0)

当然,200响应代码在这种情况下不起作用。

以下是HTTP状态代码中的组:

  • 1xx信息
  • 2xx成功
  • 3xx重定向
  • 4xx客户端错误
  • 5xx服务器错误

当然你需要使用4xx。

我认为对于您在此描述的情况,您可以使用以下任何一种方法:

405方法不允许

使用该资源不支持的请求方法请求资源;例如,在需要通过POST呈现数据或在只读资源上使用PUT的表单上使用GET。

400 Bad Request

由于某些被认为是客户端错误的内容,服务器无法或不会处理请求

409冲突

表示由于请求中的冲突而无法处理请求,例如多次更新时的编辑冲突。

此处提供更多详细信息: http://en.wikipedia.org/wiki/List_of_HTTP_status_codes