我正在开发一个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中的一个,不确定。
答案 0 :(得分:3)
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"容错"似乎是一个好主意,即期望多次发送相同的请求(例如,因为用户不耐烦并且一次又一次地点击,或者浏览器崩溃并重新启动并重新打开所有以前的选项卡,或者......)。
我的个人意见和建议如下:
一般的想法是,如果客户端请求某种方式并且已经是这种情况,则服务器有两个选项:它响应客户端"您希望的结果已经到位。因此,您的请求无效。"或者服务器可以响应"您希望的结果已经到位。你有你需要的一切。"。 使用第二个选项可以使API更加宽容,并有助于幂等性(参见http://restcookbook.com/HTTP%20Methods/idempotency/)。
答案 2 :(得分:1)
我认为djlauk的答案涵盖了很多,但我想提出一些不同的方法并添加一些信息:
我不会在/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动词POST或PUT然后删除它实体("取消关注"),其中DELETE是合适的。
我会做以下事情:
(前两个例子仅用于解释结构,如果您不需要它们,则不必实施它们。)
这确实可以让你成为用户"罗伯特":
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状态代码中的组:
当然你需要使用4xx。
我认为对于您在此描述的情况,您可以使用以下任何一种方法:
使用该资源不支持的请求方法请求资源;例如,在需要通过POST呈现数据或在只读资源上使用PUT的表单上使用GET。
由于某些被认为是客户端错误的内容,服务器无法或不会处理请求
表示由于请求中的冲突而无法处理请求,例如多次更新时的编辑冲突。
此处提供更多详细信息: http://en.wikipedia.org/wiki/List_of_HTTP_status_codes