当没有数据从REST端点返回时,我该怎么办?
我有以下端点,它的快乐路径是这样的:
GET /messages/next
Response:
{
"date_published": "...",
"message": "..."
}
通常,响应如上所述,然而有时候没有任何“下一个”消息。 我的问题是,在没有“下一步”的消息我用HTTP 204(无响应)响应或者我应该简单地返回的情况下{}
这种情况下的最佳做法是什么?
根据W3:10.2.5 204无内容
服务器已经完成了请求,但不需要返回实体主体,并且可能想要返回更新后的元信息。
我认为在你的情况下,返回一个204Http响应是适当的,除非由于某种原因,JSON负载会为你的程序做出更好的设计决定(也就是说你想返回的东西不仅仅是元信息,因为204不允许返回消息体)。
另外,请看这篇文章:REST API错误返回良好实践
204非常棘手。 RFC说
服务器已经完成了请求,但不需要返回实体主体“
所以必须有一个要求完成,并且不需要返回任何东西。 这里不是这种情况。 对于GET
请求,服务器需要返回资源的表示形式(如果有)。 所以要么资源不存在,要么返回。 它不能说“资源很无聊,我不会退货,猜猜看它是怎么样的”。
让我们看看考虑到的响应代码:
这些都是相似的,但有微妙的差异,因为有不同种类的“无”返回。
也许你有一个像/messages
这样的资源,而GET
显然会返回消息列表。 此列表可以为空: []
(或者出于安全原因,而不是{"messages": []}
)。 返回一个空列表是好的,结果为200.空列表与空列表结果(对应于null)相比,巨大的好处是客户端通常可以使用相同的代码段处理空列表,因为它处理非空列表名单。 不需要额外的逻辑来降低复杂性和出错的可能性。
也许在逻辑上没有任何回报。 这通常发生在您执行PUT
, POST
, DELETE
或PATCH
操作时。 在这些情况下,您可能会返回一个实体(旧/新实体),但您不需要。 当你不这样做时,返回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?