【问题标题】:REST API PATCH Request expected behaviorREST API PATCH 请求预期行为
【发布时间】:2026-01-10 12:05:02
【问题描述】:

我不确定以下场景的预期行为:

补丁请求 1:

"body": {
    "un_updatable_field" : "data" 
}

所以在这里我只是抛出一个异常:Field cannot be updated,随便。

补丁请求 2:

"body": {

    "all_required_fields" : "all",
    "un_updatable_field" : "data" 
}

我应该在这里做什么?抛出异常并且不更新模型?

【问题讨论】:

    标签: rest api http-patch


    【解决方案1】:

    Patch 操作应该是原子的,根据the spec

    服务器必须以原子方式应用整个更改集,并且永远不会 提供(例如,在此操作期间响应 GET)a 部分修改的表示。如果整个补丁文件 无法成功应用,则服务器不得应用任何 变化。确定什么是成功的 PATCH 可能因补丁文件和补丁类型而异 正在修改的资源。例如,常见的“diff”实用程序 可以生成一个补丁文件,适用于一个文件中的多个文件 目录层次结构。原子性要求适用于所有 直接受影响的文件。请参阅“错误处理”,Section 2.2,了解 有关状态代码和可能的错误条件的详细信息。

    看起来你的具体情况是

    无法处理的请求:可以用 422 指定(无法处理 实体)响应([RFC4918], Section 11.2)当服务器 了解补丁文档和补丁的语法 文档似乎有效,但服务器无法 处理请求。这可能包括尝试修改 以某种方式导致资源无效的资源; 例如,对格式良好的 XML 文档的修改 会导致它不再是格式良好的。也可能有 更具体的错误,例如“冲突状态”,可能是 用这个状态码发出信号,但更具体的错误会 通常会更有帮助。

    409 Conflict 也可能是合适的,具体取决于无法修改资源的原因。

    【讨论】:

      【解决方案2】:

      我假设un_updateable_field 是您系统中存在的一个字段,但您不想让人们对其进行更新。

      您可以选择忽略它,也可以选择抛出错误。你应该做什么取决于你。我更喜欢我的系统是严格的,而不是忽略无效值,因为如果出现无效值,它可能表明你在某个地方有错误,最好得到一个硬错误,这样你就可以修复这个错误。

      【讨论】: