【问题标题】:correct http status code for multiple records found找到多个记录的正确 http 状态代码
【发布时间】:2018-03-23 13:48:01
【问题描述】:

我正在尝试找出以下场景的正确 http 状态代码。

我们正在开发新的 api,其中 api 将根据名字、姓氏、出生日期、电话号码等搜索用户。如果没有找到记录,我们发送 404,如果只找到 1 条记录,则发送 200。但试图找出如果找到超过 1 条记录的适当状态。我找不到合适的标题代码。它不能是 200 或 400 或 500。它既不是错误也不是错误请求。

如果找到超过 1 条记录,我们必须要求消费者 api 发送更多信息以找出正确的记录。

我们是否有任何适合上述用例的标题

【问题讨论】:

    标签: rest


    【解决方案1】:

    我们正在开发新的 api,其中 api 将根据名字、姓氏、出生日期、电话号码等搜索用户。如果没有找到记录,我们发送 404,如果只找到 1 条记录,则发送 200。但试图找出如果找到超过 1 条记录的适当状态。我找不到合适的标题代码。它不能是 200 或 400 或 500。它既不是错误也不是错误请求。

    当您在 Google 上(或此处在堆栈交换处)搜索答案并返回多个匹配您的搜索词时,哪个 HTTP 状态代码伴随您的匹配

    答案几乎可以肯定是您收到了200 OK

    关键思想在规范中

    200(OK)状态码表示请求成功。 在 200 响应中发送的有效负载取决于请求方法。 对于本规范定义的方法,其预期含义 有效载荷的大小可以概括为:

    获取目标资源的表示

    让我们看看你的应急计划

    如果找到超过 1 条记录,我们必须要求消费者 api 发送更多信息以找出正确的记录。

    好的,那么我们将如何在网络上执行此操作?我们可能会向浏览器发送一个表单,描述解决歧义所需的额外信息。我们可能会发送带有GET 操作的表单,这意味着我们正在尝试让客户端请求不同的资源。

    如果我们鼓励客户提出更具体的要求,这意味着我们认为客户提出了错误的要求,并且可以纠正自己的错误。这告诉我们我们正在寻找来自4xx class of status codes 的东西。

    404 Not Found 是与客户端(和中间组件)进行通信的一种完全合理的方式“我们现在找不到您请求的资源的表示,您应该请求不同的资源。”

    如果你无法说服自己404 是合理的,那么你可能应该求助于400 Bad RequestStatus Code Registry 中的其他条目都不是真正合适的。

    300 Multiple Choices 是一个非常有趣的想法,但我认为你描述的语义是错误的

    提供匹配资源选择的重定向,每个资源都能够代表原始请求目标,如 300(多项选择)状态代码。

    我说在语义上是错误的,因为听起来你的情况是两个不同的概念碰巧重叠,而不是一个概念的两个不同的表示。

    从网络角度考虑:如果我要求 Bob 的主页,而您让我在 Bob 的工作主页和他的学校主页之间进行选择,那可能是 300 Multiple Choices。但是,如果您让我在 Bob Smith 的主页和 Bob MacRoberston 的主页之间进行选择,那可能不是。

    【讨论】:

      【解决方案2】:

      我从 golang 包 http 中找到了所有 HTTP 状态码的列表。

      希望此列表可以帮助您指明要使用哪一个。

      这是链接:https://golang.org/src/net/http/status.go

      编辑:可能类似于 StatusMultipleChoices(300 状态代码)?

      【讨论】:

      • 另一个要检查的代码是 303 See Other。 W3C standard 将此代码定义为返回带有链接的响应,以便客户端可以调用它,并且在本问题的本例中,根据链接响应的内容“优化”搜索。
      • 感谢您的回复,我会调查它们.. 但是 300 范围用于重定向.. 并且会看看它是否适合我的场景
      【解决方案3】:

      新的 http-API?

      如果不是:您的状态码应该只有 200 OK 成功。 4xx 代码的含义是:此类站点/服务不存在! (不是数据不存在)和 5xx 代码在技术上是错误的,这意味着您的数据库已损坏或脚本执行错误的工作。

      所以: 请求正常:状态 200 OK

      Image/css/html,... 文件未找到或服务名称不存在,您未获得授权,还有更多没有给出想要的答案:状态 4xx(错误主要来自 Browser-URL/client-侧面)

      Serverscripts 内部错误/损坏:状态 5xx(此错误在服务器端)

      3xx 代码用于一般的 URL 信息,例如移动页面(旧 URL - 新 URL),1xx 状态代码更多的含义是:如何从浏览器到服务器通信,反之亦然。

      请记住,状态代码适用于整个万维网,而不是仅适用于一个服务/服务器,因此它们必须是通用的。

      剩下的工作就是在你的 API 中完成。

      请原谅我的英语,您使用 404 作为答案,如果您的数据库中没有此类数据,我想告诉您,4xx 每次都是与服务相关的,而不是与数据相关的。如果可以请求此数据,则状态必须为 200 OK,答案是:零、无、空、无、空对象 - 不管它是什么意思 ;-)

      【讨论】:

      • 400 范围的代码不是“不存在的站点/服务”——它们是为了表明由于客户端输入而发生错误。
      • 不,这是错误的,1表示如何沟通,2表示可以询问,3表示请其他人,4表示我无法回答,没有这个工具和5 表示请原谅,我坏了。
      • 这显然是不正确的。 W3 对此非常清楚:“4xx 类状态代码适用于客户端似乎出错的情况” - w3.org/Protocols/rfc2616/rfc2616-sec10.html
      • 好的,但在问题的上下文中:4xx 是错误的。我的英语不够好,无法完整地写出所有内容。完整的 4xx 代码不是问题的答案。在我看来,这无关紧要,如果 4 表示我没有这个工具或者你不被允许要求 - 4xx 的响应是:你没有得到答案!
      • 我并不是说 4XX 是 OP 的正确答案。但是,您在帖子中坚持认为,4XX 是为了丢失信息是不正确的,并且有可能误导读者您的答案。我建议您编辑您的答案以避免这种情况,并向社区提供准确的信息信息
      猜你喜欢
      • 2011-08-31
      • 2017-06-27
      • 2018-08-03
      • 2019-05-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-22
      • 1970-01-01
      • 2012-12-06
      相关资源
      最近更新 更多