改正HTTP状态代码以用于查询已知数据之外的数据

时间:2019-04-18 13:55:14

标签: rest api-design

我正在定义一个API,并且遇到了一个我以前不必处理的问题。我想知道,对于尚未得到结果(尚未)的最佳状态代码用于响应的共识是什么。

要说明,有问题的GET端点不会返回资源,而只是返回有关已知日期的特定信息的工具。

用于执行此操作的后端日历数据会定期手动分块加载。因此,如果用户查询的日期超出(或早于)已加载的日期范围,那么API应该如何响应?

最初,我在考虑4xx错误,但是语法和查询在技术上是有效的。在另一时间(当该日期的数据已加载时)尝试完全相同的查询将导致成功的响应。

看5xx错误,似乎不是理想的选择。 503 Service Unavailable看起来离我最近,但似乎专注于临时错误。这种情况可能持续数月之久。一个复杂的问题是,API本身不知道何时会加载更多数据,因此我们也不容易使用Retry-After标头。

你会怎么做? 谢谢!

3 个答案:

答案 0 :(得分:1)

202 Accepted表示该服务已成功接受请求,并且到目前为止,该请求没有任何问题(即,没有立即的数据验证问题),但是直到进一步处理时它才能创建资源。处理。但是,此响应并不保证将创建资源。因此,它非常适合挂起的请求,因为挂起的请求在处理过程中可能会被拒绝。

Location头上附加endpoit来提供异步操作的实际状态也是很重要的,这样客户端就可以基于periodic对其进行监视。

答案 1 :(得分:1)

请勿为此使用4xx或5xx HTTP状态代码。

仅当请求或响应中有错误但没有错误时才应使用它们。

4xx错误表示请求失败(不是),而5xx则表示服务器错误。

绝对使用2xx答复,即200 OK或202 Accepted

答案 2 :(得分:0)

  

要说明,有问题的GET端点不会返回资源,而只是返回有关已知日期的特定信息的工具。

REST的角度来看,这是一种资源。

  

REST中信息的关键抽象是一种资源。可以命名的任何信息都可以是资源:文档或图像,临时服务(例如“洛杉矶今天的天气”),其他资源的集合,非虚拟对象(例如人)等。换句话说,任何可能成为作者超文本引用目标的概念都必须符合资源的定义。资源是到一组实体的概念映射,而不是在任何特定时间点对应于该映射的实体。

特别是,某种事物是一种资源这一事实在任何方面都不取决于用于提供资源表示的实现。

  

如果用户查询的日期超出(或早于)已加载的日期范围,则API应该如何响应?

通常,通过返回一个向客户说明问题所在的消息正文,并在元数据中包含一个响应代码,以指示对通用组件的响应的性质。

尤其是,您要注意缓存应该如何与您的响应进行交互,因为它们只会查看元数据,而不是有效负载。

在大多数情况下,您要报告错误并指示缓存存储响应以供以后使用。

因此,您将要使用状态代码404 Not Found

  

404(未找到)状态代码表示原始服务器未找到目标资源的当前表示,或不愿意透露该资源的存在。

404实际上是暗示target-uri的拼写错误,或者客户端不应该要求此特定资源。无论哪种情况,请求都有问题,应该以这种方式处理。

  

在另一时间(加载该日期的数据时)尝试完全相同的查询将导致成功的响应。

请注意,HTTP标准明确指出了404可能在临时条件下使用的事实:

  

404状态码不会表明这种缺乏表示是暂时的还是永久的