0

我有一个 HTML 表单,我通过 http post 提交。

有两种情况:

  • 情况一:数据有效,服务器上的数据会相应更新
  • 情况 2:数据无效,http 响应包含用户的错误消息。

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

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

这个问题与 JSON-API 无关。

4

4 回答 4

3

Mozilla Foundation 发布的 HTTP 响应代码的完整列表非常全面且易于阅读,因此我建议您始终将其作为指南进行参考。对于您提到的通用用例,您可以返回几个不同的代码 - 这取决于服务器上的数据发生了什么,以及您希望在用户浏览器中发生什么。

CASE 1:数据有效,服务端数据更新

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

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

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

CASE 2:数据无效,服务器上的数据没有更新

发生错误时需要返回的状态码取决于导致错误的原因。服务器认为是客户端责任的错误 - 例如“发送无效数据” - 具有 4XX 范围内的状态代码。该范围内的一些常见错误包括404(“未找到”)、403(“禁止”)和“未经授权”(401)。

如果客户端发送的数据由于“无效”而服务器无法处理 - 要么是因为请求本身格式错误,要么是因为数据未通过某些业务验证逻辑 - 当前的建议是返回状态400 (错误请求)

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

你可以在网上找到很多关于400422之间差异的讨论和解释,有些人至今仍在激烈争论。然而,在实践中,您只需要400代码 - 您可以在其中包含一个响应正文,如果需要,可以详细解释错误的原因。

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

于 2021-11-13T08:45:10.080 回答
1

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

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

于 2021-11-12T07:36:34.733 回答
1

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

服务器驱动的行为

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

  • 调用未经过身份验证(cookie 或令牌) - API 将返回 401 - 这告诉 UI 执行重试操作。

  • 该调用未经授权 - API 将返回 403 或 404,并且 UI 将显示错误。

  • 根据特定领域的检查,数据格式错误或无效 - API 将返回 400 并告诉 UI 出了什么问题,以便它可以执行操作。

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

我的想法

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

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

于 2021-11-12T20:40:33.523 回答
0

200 OK或者201 Created是成功POST请求的最佳选择。

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

于 2021-11-11T12:30:21.370 回答