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

Api 如果资源不可用于请求的操作,HTTP状态代码应该是什么?,api,rest,http,http-status-codes,Api,Rest,Http,Http Status Codes,我正在开发一个RESTful API。我对在这个特定场景中设置HTTP状态代码感到困惑。我不确定我(服务器)应该返回什么状态代码 假设我的应用程序具有跟踪用户功能,如果我已经跟踪一个用户,并且再次发送相同用户id的跟踪请求,那么在这种情况下,服务器的HTTP状态代码应该是什么。状态代码后面会出现一条错误消息,如:“已在跟踪用户。” 对于取消跟踪用户功能,也可以考虑类似的情况,如果我没有跟踪用户“A”,仍然会向取消跟踪用户“A”发送请求,那么服务器应该返回什么HTTP状态代码,并显示错误消息,如“

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

假设我的应用程序具有跟踪用户功能,如果我已经跟踪一个用户,并且再次发送相同用户id的跟踪请求,那么在这种情况下,服务器的HTTP状态代码应该是什么。状态代码后面会出现一条错误消息,如:“已在跟踪用户。”

对于取消跟踪用户功能,也可以考虑类似的情况,如果我没有跟踪用户“A”,仍然会向取消跟踪用户“A”发送请求,那么服务器应该返回什么HTTP状态代码,并显示错误消息,如“不跟踪用户以取消跟踪”


当然200响应代码似乎不适合我?还是这样

如果我在错误的stack exchange站点上发布了这个问题,请原谅,我在stackoverflow站点上发布这个问题只是因为它与REST API相关

编辑

从客户端,用户需要向URL发送POST请求:

http://www.myserver.com/api/follow/10
以及在服务器端服务请求之前用于身份验证的其他必要参数(如API密钥、适当的头等)

展开操作的类似URL为:

http://www.myserver.com/api/unfollow/10
现在,如果客户机发送follow请求(比如针对用户id 10的follow请求),我将发送HTTP状态代码200作为响应,即使他/她已经在跟踪id为10的用户。在这种情况下,我将与状态代码(200)一起发送类似于“已在跟踪用户”的消息


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

我将使用以下部分:

System.Net.HttpStatusCode.ServiceUnavailable;
System.Net.HttpStatusCode.MethodNotAllowed;
System.Net.HttpStatusCode.BadRequest;
GET http://www.myserver.com/api/users/robert/following/

如果它是前两个中的一个更好。

答案取决于您的API。您用“跟随用户X”或“不跟随用户Y”来描述API。这让我觉得您可能是在以RPC风格进行API设计,而不是专注于资源

如果您的API使用REST,包括HATEOAS原则,那么4xx范围内的错误代码可能是合适的(但我建议在这种情况下不要使用,请参见下文)。简而言之:HATEOAS意味着你的资源提供了指向可能的“行动”的链接。您可以在此处阅读更多信息:

除此之外,将API设计为“容错”似乎是一个好主意,也就是说,希望多次发送相同的请求(例如,因为用户不耐烦,反复单击,或者浏览器崩溃,重新启动并重新打开所有以前的选项卡,或者…)

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

System.Net.HttpStatusCode.ServiceUnavailable;
System.Net.HttpStatusCode.MethodNotAllowed;
System.Net.HttpStatusCode.BadRequest;
GET http://www.myserver.com/api/users/robert/following/
  • 跟随用户X:您的实现应该检查是否需要添加新的跟随者。不管怎样,如果用户是否已经在跟踪,请发回HTTP状态201(已创建),并添加指向资源的“位置”HTTP头
  • 取消跟踪用户X:您的实现应该检查是否需要删除跟踪者。不管怎样,如果用户是否已经从关注者中删除,请发回HTTP状态200(OK)
一般的想法是,如果客户机以某种方式请求某些内容,而事实已经如此,服务器有两种选择:要么响应客户机“您希望的结果已经存在。因此您的请求无效”。要么服务器可以响应“您希望的结果已经存在。您拥有所需的一切。”。
选择第二个选项会使API更加宽容,并有助于幂等性(请参阅)。

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

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

  • 1xx信息
  • 2xx成功
  • 3xx重定向
  • 4xx客户端错误
  • 5xx服务器错误
当然,您需要使用4xx

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

System.Net.HttpStatusCode.ServiceUnavailable;
System.Net.HttpStatusCode.MethodNotAllowed;
System.Net.HttpStatusCode.BadRequest;
GET http://www.myserver.com/api/users/robert/following/
405方法不允许 使用资源不支持的请求方法对资源发出请求;例如,在需要通过POST显示数据的表单上使用GET,或者在只读资源上使用PUT

400错误请求 由于被认为是客户端错误,服务器无法或将不会处理该请求

409冲突 指示由于请求中存在冲突(例如在多次更新的情况下存在编辑冲突)而无法处理请求

有关详情,请参阅:

422不可处理实体 在这个用例中,422似乎是正确的HTTP状态代码。 422的描述是:


422(不可处理实体)状态代码意味着服务器理解请求实体的内容类型(因此415(不支持的媒体类型)状态代码不合适),并且请求实体的语法正确(因此400(坏请求)状态代码不合适)但是无法处理所包含的说明。

我认为djlauk的回答涵盖了很多内容,但我想给出一个稍微不同的方法并添加一些信息:

不要在URI中使用动词 我不会分别在
/follow/
URI上使用POST,因为这不是很安静。请看这个SO问题:顺便回答一下:

对操作使用正确的HTTP谓词 您要做的是创建一个实体(“follow”),以便您可以使用HTTP谓词,或者在适当的位置删除该实体(“unfollow”)

我的API方法: 我会这样做:

System.Net.HttpStatusCode.ServiceUnavailable;
System.Net.HttpStatusCode.MethodNotAllowed;
System.Net.HttpStatusCode.BadRequest;
GET http://www.myserver.com/api/users/robert/following/
(前两个示例仅用于解释结构,如果不需要,则不必实现它们。)


这会让您获得用户“robert”:

响应:
200