PATCH 与 PUT 更新法案

PATCH vs PUT for Update Bill

我们有一个库存功能,我们可以在其中生成账单。有一个编辑账单 API 电话。我们很困惑将其实现为 PATCH 或 PUT。

假设我们的 BillLineItem 包含

{
   stockId
   quantity
   rate
}

id = 1 的账单有 2 个 LineItems :

|  Stock Id |   Qty        |  Rate       |
|    10     |      2       |    10       |
|    11     |      3       |    20       |

现在假设我想更改 quantity for stock Id : 10 to 5 和 我想更改 rate for stock Id : 11 to 40

我是否应该将其表示为 PUT 像这样调用:

bill : {
id : 1

lineItems : [
{
    stockId : 10,
    qty : 5,
    rate : 10   
 },

 {
    stockId : 11,
    qty : 3,
    rate : 40   
 }
]
}

我是否应该将其表示为 PATCH 像这样调用:

 bill : {
    id : 1

    lineItems : [
    {
        stockId : 10,
        qty : 5,
     },

     {
        stockId : 11,
        rate : 40   
     }
    ]
    }

还有其他参数,如 discountType、discountValue 作为 BillLineItem 的一部分,我没有在上面的示例中显示。

Wikipedia描述了HTTP方法对应RESTful操作的典型方式:

PUT - Replace all the representations of the member resources of the collection resource with the representation in the request body, or create the collection resource if it does not exist.
PATCH - Update all the representations of the member resources of the collection resource using the instructions in the request body, or may create the collection resource if it does not exist.

由于您是更新账单项目的个别属性而不是完全替换它们,PATCH 是合适的方法。

We are confused to implement this as PATCH Or PUT.

两者 PUT and PATCH 都具有远程创作语义;松散地,这两个都是请求服务器更改其资源副本以具有与客户端副本相同的表示。

PUT 是一个直接的“让你的副本像我在这个请求中包含的副本一样”。 PATCH 是“将这些更改应用于您的副本”。

由此得出PUTidempotent;同一请求的两个副本与请求的单个副本具有相同的效果。这个语义提示在不可靠的网络上可能很重要——如果 PUT 请求丢失,我们可以重新发送它。此外,重新发送消息是安全的提示既是标准的又包含在消息本身中;这意味着任何看到消息的 generic 组件都会知道可以安全地重新发送。

PATCH 没有内置幂等语义——如果消息丢失,通用组件不知道请求是否可以安全地重复,因此它需要失败,而不是而不是重试。

对于 PUT 来说,这是一个相当大的胜利。

但是,当资源非常大(意思是比 HTTP headers 大得多),而您所做的更改很小,那么只发送修订版可能是有意义的表示,而不是整个事情。在那种情况下,使用 PATCH 可能是更好的选择。

REST 的部分要点是我们使用“易于标准化的形式”进行通信,因此您应该尽可能支持标准化的补丁文档格式 (application/json-patch+json, or application/merge-patch+json),而不是发明您自己的定制格式表示。