我们的服务目前在5个城市。如果有人尝试从其他任何城市调用我们的服务API,我们都将抛出此错误Service not available in your area
。
问题是,针对此错误的合适的http代码是什么?
- 503服务不可用
- 403:禁止
或者是其他东西?
我们的服务目前在5个城市。如果有人尝试从其他任何城市调用我们的服务API,我们都将抛出此错误Service not available in your area
。
问题是,针对此错误的合适的http代码是什么?
或者是其他东西?
Answers:
任何HTTP错误代码都是不合适的。从HTTP角度看,没有任何错误或问题,因此应该在200范围之内。您可以通过发回一个告诉他们的文档来礼貌地告知您的某些用户,他们将不会得到服务。而且一切顺利。
用户将无法使用您的应用程序。那是您的业务逻辑所做出的有意识的决定,而不是不幸的事。在HTTP级别,一切都是胡扯。
编辑
看来我们在这里看到的是旧学校与新学校的冲突。设计HTTP时,没有Web服务,没有SOAP,没有JSON,没有REST原理。作为TCP之上的协议,已经考虑(接近)应用程序级别,并且定义了许多高级状态代码。当网络开始用于更丰富,更高级的服务,并且需要一种通用的方式来传输“信封”时,设计人员劫持了HTTP,而不是定义一个更新,更干净的协议,只是因为HTTP无处不在。
因此,在现代的Web服务环境中,HTTP确实仅是愚蠢的传输层,其大多数代码可能被认为不适用或已过时。之所以选择一个,是因为它接近您的应用程序状态,并且恰好位于该列表中,这曾经意味着某些东西似乎无害,但我认为它将发送错误消息。您不希望HTTP在Web服务上下文中扮演该调节角色。
5xx
错误是服务器错误-服务器上出了点问题。特别是,503表示:
由于暂时过载或计划维护,服务器当前无法处理该请求
4xx
错误是客户端错误-客户端正在发出服务器无法执行或不愿意执行的请求。特别是403表示
服务器理解了该请求,但拒绝对其进行授权。希望公开为什么禁止请求的服务器可以在响应有效负载(如果有)中描述该原因。[..]但是,出于与凭据无关的原因,可能会禁止请求。
我认为这503
显然是不正确的,因为这不是暂时性的问题-您不支持该领域的请求。可以说出您最终希望支持该区域的理由,但是代码的目的是包含一个指示客户端何时可以重试的标头。“六个月之内”并没有遵循这个意图。
403
是更好的选择,因为您的服务仅禁止来自某些区域的请求。
都不是。
如果您的API设计合理,则URL包含城市名称,例如
http://example.com/API/Vienna/HailRide
要么
http://example.com/API/HailRide?city=Vienna
由于IP地理位置不可靠,因此您的用户可能正在使用VPN,您的用户可能想为其他人欢呼,等等。根据用户的位置建议城市是API客户端的责任。通常,客户端拥有更好的资源来确定用户的位置(例如,移动设备的位置服务)。
完成此操作后,正确的答案
http://example.com/API/SomeUnsupportedCity/HailRide
要么
http://example.com/API/HailRide?city=SomeUnsupportedCity
变得很明显:404未找到:在SomeUnsupportedCity上没有打车的资源。
这似乎是一个圆孔/方钉问题。为什么您唯一的响应需要是HTTP代码?HTTP错误代码可能无法涵盖所有用例。
您所有的API调用都应返回其他消息,即一些JSON错误消息。给他们一个403(因为,实际上,他们没有使用给定位置的API的许可)并按照您的建议返回其他信息。
如果您不这样做,那么下一次您将询问当用户要求SUV但只有Prius可用时返回什么HTTP错误代码。
一些有意义。
403 Forbidden,基于Eric Stein在回答中提到的原因。您可以使用请求提供的各种信息来确定客户端在哪里以及客户端是谁,并且基于该请求,服务器将无法或不愿响应。
但是,在某些情况下,我还会提出451由于法律原因不可用作为可能的退货状态。此状态确实希望您在标题中包含(链接到)相关法规的链接。它专门用于以下情况:客户端访问您的资源是不合法的,并且在不受支持的区域或区域中不存在客户端的更一般情况。
我会避免使用5xx系列状态-这些状态通常表示服务器端技术问题。这里似乎并非如此。
如果限制是由于法律原因造成的,则相应的HTTP错误代码为HTTP 451,“由于法律原因不可用”。
这通常用于因DMCA行动或由于骚扰活动或类似原因而提起的诉讼而被撤消的材料,但回应定义的精神和文字指出:
本文档指定了超文本传输协议(HTTP)状态代码,用于在由于法律要求而拒绝资源访问时使用。
该代码本身是Ray Bradbury 对Fahrenheit 451的引用。
人们经常忘记HTTP状态代码是可扩展的。
HTTP状态代码是可扩展的。不需要HTTP应用程序理解所有已注册状态代码的含义,尽管显然希望这样。但是,应用程序务必如第一位数字所示理解任何状态码的类别,并将任何无法识别的响应视为等同于该类的x00状态码,但不可识别的响应必须被缓存。例如,如果客户端接收到无法识别的状态码431,则它可以安全地假定其请求有问题,并将响应视为已接收到400状态码。在这种情况下,用户代理应向用户呈现随响应返回的实体,
Expect token;city="Albequerque"
标头,则可能不需要。那么最合适的响应将是417,期望失败。 tools.ietf.org/html/rfc2616#section-10.4.18 当然,假设这是针对Web服务的。
起初我以为503是因为描述“服务不可用”似乎与该问题相符,但是查看定义 503确实是特定于服务器不可用的。然后再想想,您是在告诉客户端请求有问题,而不是服务器端问题。
403更接近,因为您告诉用户您已收到该消息并理解该消息,但是服务器不愿意满足该消息。这可能会造成混淆,因此可以添加文字说明来描述场景。根据RFC,404也是此代码的有效替代品。
除非有人为此梦想了一个新代码,否则403或404似乎是最接近的代码。
您应该将错误描述与您提供的代码相匹配:
如果您说,Service not available in your area.
那么您应该给a,404
因为您声称该服务不可用。
如果您说,You are not authorized for this service in your area.
那么您应该给出一个,403
因为您声称该呼叫者未被授权。
我要去第二次。
有一个当前互联网草案(将在2018 12月31日到期),其建议修订HTTP 451不可出于法律原因状态。该草案建议451响应应包含一个geo-scope-block
标头,该标头应“对应于[ISO.3166-1]中定义的以逗号分隔的alpha-2国家/地区代码列表”。但是,草案还指定不应使用代码451“由运营商根据运营商指定的策略(而不是对运营商提出法律要求)拒绝访问资源”。
因此,假设您对地理区块没有合法要求,则451不是正确的代码。那么正确的代码是什么?好吧,许多其他答案已经建议403 Forbidden,但它们似乎都是基于“观点”的,所以让我们看看其他人在做什么:
因此,没有一种通用的解决方案,您只需要选择一种您认为最适合自己情况的解决方案即可。但是无论您选择哪种方式,请务必在响应正文中说明实际问题。
我想说,仅指定一个自定义HTTP状态代码就不会有错,例如RubberDuck已经回答。400范围内的自定义状态代码实际上甚至可以说是一个不错的选择,因为如果开发人员看到“ HTTP status 499”之类的信息,那肯定会引起开发人员的注意。“ 403”太容易传递为“ 确定,所以我输入的密码错误,让我们尝试其他方法 ”,这样会浪费时间。