内容来源于 Stack Overflow,遵循 CC BY-SA 4.0 许可协议进行翻译与使用。IT领域专用引擎提供翻译支持
腾讯云小微IT领域专用引擎提供翻译支持
当某些路由未实现且不存在资源时,我总是返回404。例如,如果我有一个在 /api/people 返回人员的API,如果我试图在 /api/animals 上返回一个对象,我将返回404。
/api/people
/api/animals
我的一个同事说404只用于找不到的资源,就像我尝试使用 get /api/people/100 ,但是没有ID为100的人。对于 /api/animals ,他将返回501。
get
/api/people/100
对我来说,501的意思是当我有一条不支持其中一种方法的路由时,就像我可以 get /api/people/3 但不能 delete 它一样。
/api/people/3
delete
我决定看看 规格说明
404 (未找到)状态代码表明,源服务器 没有找到目标资源的当前表示形式,或者不愿意透露存在 。404状态代码并不表示这种缺乏表示是暂时的还是永久性的;如果源服务器可能通过某种可配置的方式知道该条件可能是永久性的,则410 (Gone)状态代码优于404。 501 (未实现)状态代码指示 服务器不支持完成请求 所需的功能。当服务器 不识别请求方法 ,并且不能支持任何资源时,这是适当的响应。
404 (未找到)状态代码表明,源服务器 没有找到目标资源的当前表示形式,或者不愿意透露存在 。404状态代码并不表示这种缺乏表示是暂时的还是永久性的;如果源服务器可能通过某种可配置的方式知道该条件可能是永久性的,则410 (Gone)状态代码优于404。
501 (未实现)状态代码指示 服务器不支持完成请求 所需的功能。当服务器 不识别请求方法 ,并且不能支持任何资源时,这是适当的响应。
对我来说,规范似乎有点模糊。同时,源服务器(404)没有找到 /api/animals 是有争议的,源服务器也确实没有实现完全填充请求(501)的方法。
在这种情况下,返回的最适当的状态代码是什么?
如果你走进书店,让柜台后面的人从书架上拿出“最好的100个蛋糕”,而这本书没有存货,他们就会回来,礼貌地说:“对不起,我找不到那本书。”在找书系统中自动实现这一点,它将返回404。
书店的经理不会出现,而是找你的书的人告诉你“恐怕我们不支持找那本书,因为我们的工作人员只能找我们有的书”(501)。
如果你走进书店,让柜台后面的人给你买割草机,他们会礼貌地回答:“对不起,我不知道该怎么做。”那应该是501。如果你让书店里的人把你刚在书架上看到的书拿掉,那也是501本。
404是,“好吧,我知道怎么得到它,但它不在那里”。A 501是"WTF!你认为这个地方是什么?“
404是否永久取决于回答问题的是什么。如果它是REST,它可能会返回JSON状态,表示这本书已经缺货,但仍在订购,并且可能有一个到期日。
真正的原因是,如果他们说404,你就会说,“它就在那儿!”他们需要说明他们不能这么做的真正原因。他们没有商业政策允许他们在不买书的情况下扔掉随机的书籍。
所以,从技术上讲,这个装置就在那里,他们可以走到书前,抓起它,但停在501,因为这个政策还没有实施。
“好的,我知道如何把REST url变成功能,这就是我知道你想要什么功能的原因,但是我们只和这里的人打交道,501”。