服务器找不到用户给定的外部资源时的HTTP错误代码



我们的图像板允许用户通过复制粘贴URL上传图像。客户端应用程序向我们的API发送POST请求,请求主体中提供图像URL。我们的web服务接收POST请求,并通过使用服务器端HTTP客户端从给定的URL下载图像来处理它(在我们的情况下是请求)。

在成功的情况下,服务会找到映像,下载它,并将其存储到服务器。该服务向客户端返回HTTP 200。

现在,如果找不到图像怎么办?如果下载尝试导致HTTP 404,该怎么办?我们应该使用什么HTTP错误代码来响应客户端?

HTTP 400错误请求不适用,因为请求格式正确,并且所有参数都有效。

HTTP 404"未找到"不适用,因为已找到并提供了请求URL,但图像URL未找到。

HTTP 502坏网关感觉不对,因为我们的服务器或上游服务器(源映像的服务器)没有问题。用户只是碰巧键入了一个不存在的图像URL。

有这方面的经验吗?哪个错误代码最正确?

首先,您应该确定这是客户端错误(4xx)还是服务器错误(5xx)。根据您的描述,这更像是一个客户端错误。客户端已请求从不存在的另一个资源(图像URL)创建资源。

这种情况并不完全匹配,尽管可以为以下2个响应代码中的每一个提供一个案例:

HTTP 409冲突:来自RFC:

由于与当前目标资源的状态。此代码用于以下情况用户可能能够解决冲突并重新提交要求

如果您认为目标资源的状态不好(找不到图像),则这适用于您的情况。如果有人在指定的URL处提供了图像,则会有效地将您的资源转换为有效状态。

这也是一个很好的匹配,因为正如RFC所说,这段代码意味着用户可能能够解决冲突(在您的情况下,用户会通过将图像发布到指定的URL来纠正这一问题)。

HTTP 424失败的依赖项:来自RFC:

424(失败的依赖关系)状态代码意味着该方法可以由于请求的操作依赖于在另一个操作上,该操作失败了。。。

这适用于您在">所请求的动作取决于另一个动作并且该动作失败";。从属操作是将图像发布到其他URL。您所描述的是一种依赖操作失败或没有发生的情况(也可以称为失败)。

由于API确定某个不可用的内容,因此其服务也不可用。

状态代码503:服务不可用最适合您的情况。根据RFC描述:

由于服务器临时过载或维护,服务器当前无法处理请求。言下之意是,这是一种暂时的情况,在一段时间后会得到缓解。如果已知,可以在Retry After标头中指示延迟的长度。如果没有给出Retry After,客户端应该像处理500响应一样处理响应。

或者如果您的API支持一种传递错误的方式(例如,告诉用户他提交的信息不正确),您可以使用此方法告诉用户外部资源不可用。这可能会更友好一些,并可能避免用户方面出现一些错误。

由于客户端应用程序向您的API服务器发送POST请求,因此应根据收到的服务器生成响应代码。在您的情况下,这是您的API服务器。

如果服务器已从客户端应用程序接收到正确的信息,并且服务器确定该请求有效,则它应返回适当的代码和适当的JSON或基于标头的错误消息。

http错误代码是假设所有可能提供服务的页面都以某种方式存储在本地的。

你的场景与这一假设不符,因此,你找不到合适的代码也就不足为奇了。

您的"未找到"情况实际上是一个应用程序错误,您应该通过在用户输入URL的表单上提供错误消息(或返回一个完全专用的错误页面或类似的页面)来通知用户。或者选择一个http错误,并接受这样一种观点,即无论怎样,它都将是一个糟糕的匹配。

现在,如果找不到图像怎么办?如果下载尝试导致HTTP 404,该怎么办?我们应该使用什么HTTP错误代码来响应客户端?

需要记住的主要事项是:你试图欺骗客户,让他们认为你是一个网站——只是一个愚蠢的文档存储,可能会对一些内容编辑消息做出响应。

对于客户端来说,主要的通信方式是响应的正文。参见RFC 7231

除了响应HEAD请求时,服务器应该发送一个包含错误情况解释的表示,以及这是暂时的还是永久的情况。

状态代码是元数据:旨在让参与交换的通用组件有机会了解发生了什么(例如:web浏览器不需要知道您要求的页面是什么来识别服务器返回的重定向响应,web浏览器在收到401未经授权的响应时要求凭据,web缓存是否使条目无效,这取决于响应返回的状态码)。

HTTP 400错误请求不适用,因为请求格式正确,并且所有参数都有效。

是的,没错。

我可能会使用500内部服务器错误,理由是服务器收到的_document没有任何问题,这些问题都涉及服务器实现的副作用

你可能会考虑另一种方法:202接受。粗略翻译的";我收到了你的消息,我理解了你的信息,稍后我会处理的"如果你不需要副作用是同步的,你可以推迟判断。这允许您执行诸如应用重试策略之类的操作。

与此响应一起发送的表示应该描述请求的当前状态,并指向(或嵌入)一个状态监视器,该监视器可以为用户提供请求何时完成的估计。

"我稍后再谈;如果你想知道进展如何,去问他->quot;

因为202是一个无错误状态代码,所以它对缓存的影响与4xx或5xx不同。如果您已经在提前考虑缓存,那么您会想清楚它的含义。

最新更新