当没有数据从REST端点返回时,我该怎么办?

我有以下端点,它的快乐路径是这样的:

GET /messages/next
Response:
{
  "date_published": "...",
  "message": "..."
}

通常,响应如上所述,然而有时候没有任何“下一个”消息。 我的问题是,在没有“下一步”的消息我用HTTP 204(无响应)响应或者我应该简单地返回的情况下{}

这种情况下的最佳做法是什么?


根据W3:10.2.5 204无内容

服务器已经完成了请求,但不需要返回实体主体,并且可能想要返回更新后的元信息。

我认为在你的情况下,返回一个204Http响应是适当的,除非由于某种原因,JSON负载会为你的程序做出更好的设计决定(也就是说你想返回的东西不仅仅是元信息,因为204不允许返回消息体)。

另外,请看这篇文章:REST API错误返回良好实践


204非常棘手。 RFC说

服务器已经完成了请求,但不需要返回实体主体“

所以必须有一个要求完成,并且不需要返回任何东西。 这里不是这种情况。 对于GET请求,服务器需要返回资源的表示形式(如果有)。 所以要么资源不存在,要么返回。 它不能说“资源很无聊,我不会退货,猜猜看它是怎么样的”。

让我们看看考虑到的响应代码:

  • 200 OK:资源在逻辑上存在并且表示在主体中返回
  • 204无内容:请求已满足,没有任何内容可以返回
  • 404未找到:请求的资源不存在
  • 这些都是相似的,但有微妙的差异,因为有不同种类的“无”返回。

    也许你有一个像/messages这样的资源,而GET显然会返回消息列表。 此列表可以为空: [] (或者出于安全原因,而不是{"messages": []} )。 返回一个空列表是好的,结果为200.空列表与空列表结果(对应于null)相比,巨大的好处是客户端通常可以使用相同的代码段处理空列表,因为它处理非空列表名单。 不需要额外的逻辑来降低复杂性和出错的可能性。

    也许在逻辑上没有任何回报。 这通常发生在您执行PUTPOSTDELETEPATCH操作时。 在这些情况下,您可能会返回一个实体(旧/新实体),但您不需要。 当你不这样做时,返回204。

    也许资源不是空的,但不存在。 在这种情况下,你应该返回404。

    作为一个类比将资源视为文件(资源不需要是文件,但它们可以,对于刚好是HTTP起源的静态HTML而言很常见):200表示资源/文件存在,但可能为空。 204表示该服务没有义务返回文件。 404意味着服务器被请求返回一个文件,但没有文件返回。

    因此,在您的示例中,如果没有下一条消息,则GET /messages/next应返回404,如果有下一条消息,则返回200,但此消息为空。 它不应该返回204。

    当使用HATEOAS时,资源/messages/next应该只有在有下一个消息时才被链接。

    或者,您可以使用条件GET请求(例如,使用If-Modified-Since标头)来GET资源/messages/newest并请求它。

    也看看这个不错的概述。

    链接地址: http://www.djcxy.com/p/45339.html

    上一篇: What should I do when there is no data to return from a REST endpoint?

    下一篇: Error messages from REST requests