Rest HTTP获取请求状态204 Vs 404

Rest HTTP获取请求状态204 Vs 404,rest,http-status-code-404,httpresponse,Rest,Http Status Code 404,Httpresponse,我有2个资源用户和相册。用户有一个相册列表。要获得相册,有2个RESTAPI 用户/{userId}/albums/{albumId}如果未找到,则按albumId获取相册返回404 user/{userId}/albums按userId获取所有相册。在这种情况下,如果用户没有相册,那么状态代码204或404是什么 错误代码404 当用户试图跟踪断开或死链接时,网站托管服务器通常会生成“404未找到”网页 返回代码204 服务器已完成请求,但不需要返回实体正文 结论 显然,您需要返回204状态码

我有2个资源用户和相册。用户有一个相册列表。要获得相册,有2个RESTAPI

  • 用户/{userId}/albums/{albumId}如果未找到,则按albumId获取相册返回404
  • user/{userId}/albums按userId获取所有相册。在这种情况下,如果用户没有相册,那么状态代码204或404是什么
  • 错误代码404 当用户试图跟踪断开或死链接时,网站托管服务器通常会生成“404未找到”网页

    返回代码204 服务器已完成请求,但不需要返回实体正文

    结论
    显然,您需要返回204状态码。如果您使用404,用户可能会受到干扰。此外,当目标相册不存在时,可以使用404。将404同时用于1和2是不合逻辑的。

    没有任何专辑真的被视为错误吗?假设相册作为JSON数组返回,对这种情况的常见响应是HTTP 200,其主体为空数组

    返回404表示该资源不存在,这意味着甚至不可能为该特定用户请求相册列表。但事实上,有可能成功返回专辑列表,只是列表是空的。对我来说,这一点也不例外。这与使用不存在的ID(使用另一个端点)检索一个特定的相册完全不同;在这种情况下,404是正确的

    虽然204似乎比404好,因为它至少告诉客户端请求成功但没有内容,但它的意图并不是真正用来表示“成功缺席”。相反,它表示资源确实存在,但出于某种原因,服务器选择不将资源包含在响应主体中——例如,请求的目的可能只是将一些头传递回客户端

    204还可以用作对POST请求的响应,其中服务器执行某些操作而不必创建任何新资源(这将意味着创建了201),或者由于某些其他原因而与返回任何资源无关

    我想很明显,你需要的是一个

    GET /user/xxx/albums
    
    HTTP/1.1 200 OK
    
    []
    
    以下是定义HTTP协议的用户对状态代码的说明:

    状态代码的第一位数字定义了响应的类别。最后两位数字没有任何分类角色。有 第一个数字的5个值:

      - 1xx: Informational - Request received, continuing process
    
      - 2xx: Success - The action was successfully received,
        understood, and accepted
    
      - 3xx: Redirection - Further action must be taken in order to
        complete the request
    
      - 4xx: Client Error - The request contains bad syntax or cannot
        be fulfilled
    
      - 5xx: Server Error - The server failed to fulfill an apparently
        valid request
    
    在您的情况下,请求成功,但没有要显示的相册,因此您肯定应该使用2xx类别中的状态

    以下是RFC对204状态的说明:

    10.2.5 204无内容

    服务器已完成请求,但不需要返回 实体主体,并且可能希望返回更新的元信息。这个 响应可能包括以下形式的新的或更新的元信息: 实体标题,如果存在,则应与 请求的变体

    如果客户端是用户代理,则不应更改其文档 从导致发送请求的视图中查看。这一反应 主要是为了允许操作的输入 在不更改用户代理的活动文档视图的情况下, 尽管任何新的或更新的元信息都应应用于 当前在用户代理的活动视图中的文档

    204响应不能包括消息体,因此是 始终由标题字段后的第一个空行终止


    RFC声明204主要用于允许输入,因此您不应该使用这个。在本例中,我将使用200。

    当您请求特定的资源(例如用户)而该用户不存在时,则应返回404。例如,您有一个API可以使用以下URL检索用户:

    https://yourdomain.com/api/users/:userid
    
    如果请求检索不存在的用户1234,那么您应该返回404。在这种情况下,客户端请求的资源不存在

    https://yourdomain.com/api/users/1234 
    404
    
    现在假设您有一个api,它使用以下url返回系统中的所有用户:

    https://yourdomain.com/api/users
    

    如果系统中没有用户,那么在这种情况下,您应该返回204。

    我同意回答,但我认为是204或200,这取决于相册列表为空时您的回答

    如果您将返回一个空数组,返回200个代码,如果您不想返回任何内容,那么正确的数组将是204。(我喜欢有空列表的200)

    仅将404与不存在的资源一起使用,如果是空列表,请选择204或200


    好黑客

    或者是一个空的JSON对象——如果JSON适用。那么RESTAPI端点永远不会返回404,因为路由是手工定义的?404仅在您使用api未定义的url或在分布式系统中不可用的url时才会由服务器引发。200表示请求成功,并且响应中有数据。在这种情况下,响应中没有数据,因此204实际上是要返回的正确状态代码。现在,如果您调用GET/user/xxx/albums,其中xxx是一个不存在的用户,那么我将返回一个404,其中包含一条消息,说明找不到什么资源。因为这是一个GET,所以与您收到204个帖子的典型场景没有任何混淆。在一天结束时,你的API应该有文档,告诉开发者状态代码对于一个特定的请求意味着什么。我不同意。有数据,一个空数组。恕我直言,强迫客户机将一个完全有效的列表查询(该查询暂时为空)视为一个错误是非常奇怪的,因此我们同意404被排除在外。然而,204对我来说有一个特殊的用途,用于客户机实际上不想要或不能获得任何资源的地方。我见过的大多数API都会使用空数组,我不明白为什么它会出现在任何wa中