【问题标题】:Which HTTP status codes do you actually use when developing web applications? [closed]在开发 Web 应用程序时,您实际使用了哪些 HTTP 状态码? [关闭]
【发布时间】:2008-12-02 21:13:35
【问题描述】:

HTTP/1.1 规范 (RFC2616) 定义了一些状态代码,HTTP 服务器可以返回这些状态代码来表示某些条件。其中一些代码可以被 Web 应用程序(和框架)使用。在经典和异步 (XHR) 响应中,哪些代码在实践中最有用,您在什么情况下使用它们?

应该避免哪些代码,例如。应用程序是否应该完全混淆 5xx 代码范围?在 REST Web 服务中返回 HTTP 代码时,您的约定是什么?您是否使用过 302 以外的重定向?

【问题讨论】:

    标签: http rest


    【解决方案1】:

    我正在使用的那些(无论如何我都可以通过grep 'Status:' 快速找到):

    • 200 成功检索到资源而不影响它
    • 201 每当表单提交将重要内容(论坛帖子、用户帐户等)放入数据库时​​发送,从而创建新资源
    • 204 以空正文发送,例如在 DELETE 之后
    • 304 HTTP 缓存。我发现这个非常很难做到,因为它必须考虑到用户更改显示设置等等。我想出的最好的主意是使用用户偏好的哈希作为 ETag。大多数浏览器在这里都有不可预测和不一致的行为并没有帮助......
    • 400 用于未通过某些验证检查的错误表单提交。
    • 403 每当有人在不该出现的地方时使用(尽管我试图通过不显示用户不应访问的内容的链接来避免这种情况)。
    • 404 除了普通的网络服务器之外,当 URL 包含无效的 ID 号时,我会使用这些。我想在这种情况下检查是否存在更高的有效 ID 并发送 410 是个好主意...
    • 429 当用户的请求过于频繁时
    • 500:我倾向于将这些放在 catch{ } 块中,唯一的选择就是放弃,以确保将有意义的内容发送到浏览器。

    我意识到我可以简单地让服务器为所有内容发送“200”,但是当用户看到(或导致)错误并且不告诉您它们时,它们会减轻很多痛苦。我已经有了显示拒绝访问消息等的功能,所以无论如何添加这些功能并不多。

    【讨论】:

    • 谢谢,我正在寻找这样的实用视角。您是出于某种特殊原因使用 201 而不是 200,还是只是为了更好地遵守标准?
    • 顺便说一句,我认为您检查更高 ID 并发送 410 而不是 404 的想法对我来说似乎有点矫枉过正......
    • 201 主要是为了完整性,尽管它确实有助于跟踪特定代码中的错误(即您可以查看访问日志并查看表单是否已成功处理)
    【解决方案2】:

    418:我是个茶壶

    来自http://www.ietf.org/rfc/rfc2324.txt超文本咖啡壶控制协议(HTCPCP/1.0)

    【讨论】:

    • 我最喜欢的调试状态码:)
    【解决方案3】:

    不要忘记 503 - 服务不可用。这对于站点停机至关重要。特别是在搜索引擎方面。

    假设您将网站关闭几个小时以进行维护或升级工作。通过将所有请求定向到返回 503 代码的友好页面,它告诉蜘蛛“稍后再试”。

    如果您只是显示“暂时关闭”页面但仍返回 200 OK,则蜘蛛可能会为您的错误页面编制索引,或者更糟糕的是,将现有索引替换为此“新”内容。

    这可能会严重影响您的 SEO 排名,尤其是当您的网站大型且受欢迎时。

    【讨论】:

      【解决方案4】:

      303 See OtherPRG 的必需品,如果您还没有使用,现在应该使用它。

      【讨论】:

        【解决方案5】:

        根据我的经验,以下是最常见的响应代码:

        1xx-2xx 范围内的响应代码通常由底层网络服务器(即 Apache、IIS)自动处理,因此您无需担心这些。

        代码 301 和 302 通常用于重定向,当客户端或代理已经包含数据的有效副本并且不需要来自服务器的新版本时,304 会被大量使用(请参阅 RFC 以了解确切的详细信息这是如何工作的)。

        代码 400 通常用于指示客户端发送了导致服务器出现问题的错误或意外数据。

        代码 403 用于执行身份验证,这通常再次由服务器配置自动处理。

        代码 404 是未找到页面的错误代码。

        代码 500 表示服务器中的错误情况不一定是由客户端发送的数据引起的。例如,数据库连接失败、编程错误或其他未处理的异常。

        如果您从 Web 服务器(例如 Apache)代理到后端的应用服务器(例如 Tomcat),并且无法与应用服务器建立连接,通常会看到代码 502。

        对于异步调用(即 AJAX/JSON 响应),始终返回 200 响应通常是最安全的。即使服务器在处理请求时出现错误,最好将错误包含在 JSON 对象中,让客户端以这种方式处理。原因是并非所有网络浏览器都允许访问非 200 响应代码的响应正文。

        【讨论】:

          【解决方案6】:

          当有人尝试获取只能发布的 URL 时,我倾向于使用 405 Method Not Allowed。其他人也这样做吗?

          【讨论】:

            【解决方案7】:

            Aida/Web 框架中我们只使用

            • 200 好
            • 302 重定向
            • 404 未找到
            • 500 内部服务器错误

            【讨论】:

              【解决方案8】:

              我基本上都会在适当的时候使用它们。规范本身定义了每个代码以及应该使用它们的环境。

              在构建 RESTful Web 应用程序时,我不建议选择状态代码,并将自己限制在整个范围的子集。也就是说,除非一个人正在为特定的 HTTP 客户端构建 Web 应用程序——在这种情况下,一个人并不是真正构建 Web 应用程序,而是为该特定客户端构建一个应用程序。

              在我的公司,我们有一些 Flex 客户。他们无法正确处理 200 以外的状态代码,因此我们让他们在请求中发送一个特殊参数,告诉我们的服务器始终发送 200,即使它不是正确的响应。

              【讨论】:

              • 我并不是要限制自己,而是在典型的 Web 应用程序的上下文中,只有状态代码的某个子集才有意义。有些仅在涉及 Web 服务器或代理时有用,有些则非常具体,在实践中很少使用。
              【解决方案9】:

              我一直在做关于数字 500 的噩梦。

              【讨论】:

              • 很好,没有 HTTP 状态码 666 :)
              • 更严重的是,当您更改某些内容的 URL 时,301(永久移动)很有用。
              【解决方案10】:

              当您的 Web 应用程序引发异常时,Aida/Web 中会返回 500 内部服务器错误。因为这是一个 Smalltalk 应用程序,所以当用户获得 500 和一个短堆栈时,服务器上会引发一个异常窗口(如果你运行它 headfull)。

              然后,您可以在服务器上打开一个完整的调试器并尝试解决问题,而服务器当然会继续运行。另一个好处是全栈异常窗口等着你,直到你回来。

              结论:500是福,不是噩梦!

              【讨论】:

                【解决方案11】:

                我使用 409 而不是 400 来处理不良用户数据(即表单提交)。

                409 的规范继续说明版本冲突,但它提到应在响应中发送有关如何解决问题的信息。非常适合格式错误的电子邮件或错误的密码信息。

                400 仅解决语法问题,在我看来,请求根本没有意义,而不是一些正则表达式失败。

                【讨论】:

                  【解决方案12】:

                  我使用 webmachine,它会自动生成正确的错误代码。但在某些情况下,我需要自己提供。我发现在这些情况下返回 666 对开发和调试很有帮助,所以我可以很容易地分辨出哪些来自我的代码,哪些来自 webmachine。此外,当它出现时,我会笑出声来。您必须记住在实际部署之前更改此设置。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 2011-11-20
                    • 1970-01-01
                    • 2021-12-14
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2010-10-03
                    相关资源
                    最近更新 更多