我有一个 HTML 表单,我通过 http post 提交。
有两种情况:
- 情况一:数据有效,服务器上的数据会相应更新
- 情况 2:数据无效,http 响应包含用户的错误消息。
每种情况应使用哪些 http 状态代码?
我使用htmx提交表单。这意味着我不需要使用 POST/Redirect/GET 模式。
这个问题与 JSON-API 无关。
我有一个 HTML 表单,我通过 http post 提交。
有两种情况:
每种情况应使用哪些 http 状态代码?
我使用htmx提交表单。这意味着我不需要使用 POST/Redirect/GET 模式。
这个问题与 JSON-API 无关。
Mozilla Foundation 发布的 HTTP 响应代码的完整列表非常全面且易于阅读,因此我建议您始终将其作为指南进行参考。对于您提到的通用用例,您可以返回几个不同的代码 - 这取决于服务器上的数据发生了什么,以及您希望在用户浏览器中发生什么。
根据您的简短描述,可能适用的不同状态代码是:
如果使用 HTMX,200或201响应将包含您希望在页面上更新的记录的实际 html 片段 - 并且 HTMX 将在收到响应时自动为您替换它。使用205响应,您可以发送HX-Trigger 响应标头,该标头将在需要更新自身的界面元素上调用自定义事件 - 请参阅文档中的示例。
发生错误时需要返回的状态码取决于导致错误的原因。服务器认为是客户端责任的错误 - 例如“发送无效数据” - 具有 4XX 范围内的状态代码。该范围内的一些常见错误包括404(“未找到”)、403(“禁止”)和“未经授权”(401)。
如果客户端发送的数据由于“无效”而服务器无法处理 - 要么是因为请求本身格式错误,要么是因为数据未通过某些业务验证逻辑 - 当前的建议是返回状态400 (错误请求)。
很多年前,有人认为状态码400应该只用于表示格式错误的请求(语法错误),而不是表示业务验证逻辑失败(语义错误)。有很多争论,暂时创建了一个新的状态代码(422),它应该专门涵盖语义错误。然而,在 2014 年,状态400代码的官方定义被更改,以允许包含语法和语义错误 - 这使得状态422基本上没有必要。
你可以在网上找到很多关于400和422之间差异的讨论和解释,有些人至今仍在激烈争论。然而,在实践中,您只需要400代码 - 您可以在其中包含一个响应正文,如果需要,可以详细解释错误的原因。
请注意,使用 HTMX 时,带有400代码的响应应自动触发htmx:responseError事件。例如,您可以捕获该事件以更新您的表单界面元素,以防服务器捕获到数据验证错误。
嗯,200 OK
是201 Created
最好的成功的结果。
对于无效数据,我会返回422 Unprocessable Entity
,因为标题是正确的,但正文不是(尽管服务器可以解析)。需要注意的是,一些 HTTP 客户端无法正确处理 422,在这种情况下您必须使用400 Bad Request
,但是,大多数现代客户端都可以。
您说过这与 JSON API 无关,但您将如何满足此类要求 - 尚不清楚这是否与您的场景相关???
服务器驱动的行为
我看不到客户端如何根据输入数据决定 HTTP 状态代码。客户将如何处理这些示例?
调用未经过身份验证(cookie 或令牌) - API 将返回 401 - 这告诉 UI 执行重试操作。
该调用未经授权 - API 将返回 403 或 404,并且 UI 将显示错误。
根据特定领域的检查,数据格式错误或无效 - API 将返回 400 并告诉 UI 出了什么问题,以便它可以执行操作。
服务器处理出现问题,例如,由于数据库已关闭,无法保存数据。
我的想法
htmx 看起来很有趣,但在使用它之前的一个关键要求是确保 htmx 可以读取服务器端错误响应并使用返回的值。也许有一种优雅的方式可以做到这一点......
也许我只是偏执狂:)。但在选择没有阻塞问题的技术时,值得小心。在大多数系统中,缺乏错误处理控制将是一个阻塞问题。
200 OK
或者201 Created
是成功POST
请求的最佳选择。
但是,对于无效数据,您可以通过415 Unsupported Media Type