处理 http post 时使用哪些 http 状态代码?

Which http status codes to use when processing http post?

我有一个 HTML 表单,我通过 http post.

提交了

有两种情况:

每种情况应使用哪个 http 状态代码?

我使用 htmx 提交表格。这意味着我不需要使用 POST/Redirect/GET 模式。

此问题与 JSON-API 无关。

200 OK201 Created 是成功 POST 请求的最佳选择。

然而,对于无效数据,您可以通过415 Unsupported Media Type

嗯,200 OK201 Created 是成功的最佳结果。

对于无效数据,我会 return 422 Unprocessable Entity,因为 headers 是正确的,但 body 不是(尽管服务器可以解析)。需要注意的是,某些 HTTP 客户端无法正确处理 422,在这种情况下,您必须使用 400 Bad Request,但是,大多数现代客户端都可以。

您说这与 JSON APIs 无关,但是您将如何满足此类要求 - 目前尚不清楚这是否与您的场景相关???

服务器驱动的行为

我不明白客户端如何根据输入数据决定 HTTP 状态代码。客户将如何处理这些示例?

  • 呼叫未通过身份验证(cookie 或令牌)- API 将 return 401 - 这告诉 UI 执行重试操作。

  • 呼叫未被授权 - API 将 return 403 或 404,而 UI 将显示错误。

  • 根据域特定检查,数据格式错误或无效 - API 会 return 400 并告诉 UI 哪里出了问题,以便它可以执行操作。

  • 服务器处理中出现错误,例如由于数据库已关闭而无法保存数据。

我的想法

htmx 看起来很有趣,但在使用它之前的一个关键要求是确保 htmx 可以读取服务器端错误响应并使用值 returned。也许有一种优雅的方法可以做到这一点...

也许我只是偏执狂:)。但是在选择没有阻塞问题的技术时值得小心。缺乏错误处理控制将是大多数系统中的一个阻塞问题。

Mozilla 基金会发布的 complete list of HTTP response codes 非常全面且易于阅读,因此我建议您始终将其作为指南进行查阅。对于您提到的通用用例,您可以使用几个不同的代码 return - 取决于服务器上的数据发生了什么,以及您希望在用户浏览器中发生什么。

案例 1:数据有效,服务器上的数据已更新

根据您的简短描述,可能适用的不同状态代码是:

  • 200(确定):您正在更新自己服务器上的现有记录 - 例如,用户正在提交更新他们在您网站上的现有联系信息的表单 -并收到信息,记录更新成功。响应通常包含更新记录的副本。
  • 201(已创建):您不是在更新现有记录,而是在您的服务器上创建新记录 - 例如,您的用户正在添加新的 phone 号码添加到他们的联系方式,该联系方式作为单独的 'phone' 记录保存在您的数据库中。响应应包含新创建记录的副本。
  • 205(Reset Content):同200,但暗示需要刷新浏览器视图。当正在更新的记录具有由服务器动态计算的值并且可能会根据您提交的值自动更改时,这很有用。例如,如果您让用户在他们的在线个人资料中添加额外信息,这可能会授予他们在网站上的特殊地位、徽章和特权。这意味着,如果用户正在查看他们的个人资料信息,则该信息将需要使用服务器自动授予的新 'status' 进行更新。 205 响应主体通常为空,这意味着要更新浏览器视图,您的响应处理代码需要:
    • 做进一步的 ajax 请求并更新您的相关部分 与来自服务器的新信息交互,或
    • 将用户重定向到新的 URL,或
    • 重新加载整个页面。

如果使用 HTMX,200201 响应将包含您记录的实际 html 片段希望在页面上更新 - HTMX 会在收到响应时自动为您替换它。使用 205 响应,您可以发送一个 HX-Trigger response header 来调用需要自我更新的界面元素上的自定义事件 - 请参阅文档中的示例。

案例 2:数据无效,服务器上的数据未更新

发生错误时需要 returned 的状态代码因错误原因而异。服务器认为是客户端责任的错误 - 例如 'sending invalid data' - 具有 4XX 范围内的状态代码。该范围内的一些常见错误包括 404 ('Not Found')、403 ('Forbidden') 和 'Unauthorised' (401).

在客户端发送服务器无法处理的数据的情况下,因为它是 'not valid' - 因为请求本身格式错误,或者因为数据没有通过某些业务验证逻辑 - 当前建议是 return 状态 400(错误请求).

很多年前,有些人认为状态码400应该只用于指示格式错误的请求(语法错误)——而不是指示业务验证逻辑失败(语义错误)。有很多争论,并暂时创建了一个新的状态代码(422),它应该专门涵盖语义错误。然而,在 2014 年,official definition of the status 400 code 被更改为允许包含语法和语义错误 - 这使得状态 422 本质上是不必要的。

你可以在网上找到lots of discussions and explanations关于400422的区别,还有人为此争论不休到今天。然而,在实践中,400 代码就是您所需要的全部 - 您可以在其中包含一个响应主体,如果需要,它会详细解释错误的原因。

请注意,在使用 HTMX 时,带有 400 代码的响应应自动触发 htmx:responseError 事件。您可以捕获该事件,例如,在服务器捕获到数据验证错误的情况下更新您的表单界面元素。