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

时间:2019-02-02 15:50:01

标签: rest http

我们的图像板允许用户通过复制粘贴网址上载图像。客户端应用程序发送POST请求我们的API与请求体中给出的图像URL。我们的Web服务接收POST请求,并通过使用服务器端HTTP客户端(在本例中为request)从给定的URL下载图像来处理它。

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

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

HTTP 400 Bad Request是不适用的,因为该请求是良好形成并且所有参数是有效的。

HTTP 404 Not Found由于请求URL被发现并担任虽然图像URL不是不适用。

HTTP 502 Bad Gateway感觉不对,因为我们的服务器或上游服务器(源映像的服务器)没有问题。用户只是发生在不存在的图像URL键入。

对此事有经验吗?哪个错误代码最正确?

4 个答案:

答案 0 :(得分:1)

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

虽然可以为以下两个响应代码中的每一个辩护,但这种情况没有完美的匹配:

HTTP 409冲突:来自RFC

  

该请求不能被完成,由于与电流的冲突   目标资源的状态。该代码用于以下情况   用户可能能够解决冲突并重新提交   请求...

如果您认为目标资源处于不良状态(未找到映像),则适用于您的情况。如果有人通过指定的URL提供图像,则可以有效地将您的资源转换为有效状态。

这也是一个很好的匹配,因为如RFC所述,此代码表示用户可能能够解决冲突(在您的情况下,用户可以通过将图像发布到指定的URL来纠正此冲突)。

<强> HTTP 424无法依赖:从RFC

  

424(依赖失败)状态代码表示该方法可以   无法对资源执行此操作,因为请求的操作取决于   在另一项操作上,该操作失败了...

这适用于您的情况,因为“ 请求的操作取决于另一个操作而该操作失败”。从属操作是将图像发布到另一个URL。您所描述的是这种依赖操作失败或没有发生(也可以称为失败)的情况。

答案 1 :(得分:0)

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

状态码503:“服务不可用”最适合您的情况。 根据{{​​3}}:

  

由于服务器暂时超载或维护,服务器当前无法处理该请求。这意味着这是一个暂时性状况,经过一段时间的延迟后会缓解。如果知道的话,延迟的长度可以在Retry-After头中指出。如果未给出Retry-After,则客户端应像处理500响应那样处理响应。

或者,如果您的API支持交流错误的方式(例如,告诉用户他提交的信息不正确),则可以使用此方法来告知用户外部资源不可用。这可能会更友好一些,并且可以避免在用户方面引起一些错误。

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

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

答案 2 :(得分:0)

假设

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

您的情况不匹配的假设,因此它不应该作为一个惊喜,你不觉得,妥善适合您的帐单代码。

您“找不到”的情况实际上是一个应用程序错误,你应该在表格上提供的错误信息,他输入的URL通知你的情况下用户(或返回一个完全专用的错误页面或一些这样的)。还是选择一个http错误,然后接受一个想法,即无论如何它都不适合。

答案 3 :(得分:0)

  

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

要记住的主要事情:您试图欺骗客户以为您是一个网站-只是一个笨拙的文档存储区,可能会响应某些内容编辑消息。

对于客户而言,沟通的主要方式是响应的 body 。参见RFC 7231

  

响应HEAD请求时除,服务器应该发送包含有关错误情况的解释的表示,以及它是否是临时或永久的条件。

状态代码是元数据:旨在使参与交换的通用组件有机会了解正在发生的事情(示例:Web浏览器不需要知道哪个页面您要识别服务器返回的redirection响应,Web浏览器在收到401 unauthorized响应时会要求提供凭据,Web缓存invalidating条目,取决于是否由响应返回的状态代码)。

  

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

是的,完全正确。

我可能会使用500 Internal Server Error,原因是服务器收到的_document没问题,所有问题都与服务器实现的副作用有关。 / p>

您可以考虑使用另一种方法:202 Accepted。粗略翻译为“我收到了您的消息,我理解了您的消息,稍后再处理。”如果您不需要使副作用同步,则可以推迟判断。这样您就可以执行诸如应用重试策略之类的事情。

  

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

“我稍后再讲;如果您想知道进展如何,请问他->”

由于202是非错误状态代码,因此它对缓存的影响与4xx或5xx的影响不同。如果您已经在考虑缓存,那么请考虑一下它的含义。