当请求结果为空/未找到时,以JSON的形式响应前端的最佳方法

当请求结果为空/未找到时,以JSON的形式响应前端的最佳方法,json,rest,Json,Rest,为了简化,假设您有一个RESTAPI,前端有一个登录表单,您想检查用户是否存在。前端HTTP/将一些数据发布到后端,后端查询数据库。结果是用户不存在,您希望将该结果返回到前端 我知道可能有很多方法可以返回结果,但是有没有“标准”或“更正确的方法”可以将“用户不存在”结果作为JSON返回?我在想一些可能性: 将JSON作为字符串返回,并返回结果 返回空对象 返回布尔值为doesNotExist=false的空用户对象 返回404未找到或其他http代码响应 4和1的混合 解决方案: 用HTTP40

为了简化,假设您有一个RESTAPI,前端有一个登录表单,您想检查用户是否存在。前端HTTP/将一些数据发布到后端,后端查询数据库。结果是用户不存在,您希望将该结果返回到前端

我知道可能有很多方法可以返回结果,但是有没有“标准”或“更正确的方法”可以将“用户不存在”结果作为JSON返回?我在想一些可能性:

  • 将JSON作为字符串返回,并返回结果
  • 返回空对象
  • 返回布尔值为doesNotExist=false的空用户对象
  • 返回404未找到或其他http代码响应
  • 4和1的混合
  • 解决方案:

    用HTTP404代码响应就足够了,不需要JSON正文。请记住,对于这个登录用例,正如答案所指出的,当出于安全目的找不到用户时,不建议使用404HTTP重新发送

    有用资源:


    没有标准的方式,大多数情况下HTTP状态代码就足够了。
    如果您想到一条具有更多详细信息的自定义消息,则创建一个包含错误代码、详细信息甚至异常类别的POJO,并将其返回到UI。

    处理找不到资源的情况的标准方法是返回404错误状态。例如,如果您的uri类似于
    /user/{id}
    ,则这是试图使用给定id访问user类型的资源/文档,在这种情况下,如果找不到用户,则404将是完全合适的。在这种情况下,不需要专门返回json响应


    但是,您应该知道,出于安全目的,以这种方式验证用户的存在是不安全的。如果攻击者知道有效的用户名或id,他们可以尝试强行输入密码。许多系统都会对无效的用户标识符和无效的密码(无效凭据)返回相同的错误,因此攻击者无法知道他们是否正确猜测了用户名。在尝试验证用户身份时,401错误通常被认为是有用的响应。如果用户不存在或给定的凭据无效,则应返回401。

    “…但是否有“标准”或“更正确的方法”将“用户不存在”结果返回为JSON…”不,没有。有各种各样的替代方案,主要是固执己见的方案。参数主要在404和200之间,带有状态标志。它取决于你所考虑的资源(检索端点,或者被检索的用户),这使我们回到了观点。多谢指点。因此,我理解,对于这个登录用例,您不需要JSON响应,无论用户是否存在,或者出于安全目的,密码是否不正确,您都会返回相同的状态。但抛开良好实践不谈,说它只是一种随机形式,您希望根据在数据库中找到的内容显示不同的消息(“未找到”、“找到但此字段不存在”、“错误信息”…)您完全使用HTTP响应在前端处理此问题吗?您总是返回相同的http代码+消息吗?你把信息放在哪里?代码就足够了。在我的示例URL中,如果{id}不存在,您将响应404。不建议使用错误消息。UI应该决定如何向用户而不是API表示错误。将内容添加到错误状态通常保留500+,并且仅在调试模式下,您尝试将错误详细信息传达给开发人员。好的,tyvm,这很有启发性。因此,我想,要让UI处理响应,您可以为您的应用程序提供一个唯一的错误代码,供UI解释。比如说Http正文:“状态”:404,“错误”:“错误-0001”“是应用程序特有的错误-0001吗?或者有更好的方法吗?不完全是。对于404这样的预期状态,你不需要一个身体——它是多余的。状态代码本身就是足够的信息。只有当确实需要额外的东西时,才需要添加一个主体,例如在500服务器错误的情况下添加堆栈跟踪。