PATCH vs PUT更新账单

时间:2019-09-06 05:53:34

标签: rest patch put

我们具有库存功能,可在此生成账单。有一个Edit Bill API调用。我们很困惑将其实现为PATCH或PUT。

假设我们的BillLineItem组成

 //MARK:- touch method
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        let touch = touches.first
        start_point = touch!.location(in: self.imageView)
    }

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        let touch = touches.first
        let position = touch!.location(in: self.transformView)
        self.meshBuldgeAtPoint(point: position)

    }


//MARK:- Mesh sludge
 func meshBuldgeAtPoint(point:CGPoint) {

        old_start_point = start_point
        old_end_point = point

     self.transformView.meshTransform = warpTransform(from: start_point,to: point, in:CGSize(width: self.transformView.bounds.size.width, height: self.transformView.bounds.size.height))

    }



// MARK:-  Wrap Image
    func warpTransform(from startPoint:CGPoint,
                       to endPoint:CGPoint, in size:CGSize) -> BCMutableMeshTransform {

        let _startPoint = CGPoint(x: startPoint.x/size.width, y: startPoint.y/size.height)
        let _endPoint = CGPoint(x: endPoint.x/size.width, y: endPoint.y/size.height)
        let dis = distance(a: _startPoint, b: _endPoint)

        let dragDistance = dis

        for i in 0..<mesh.vertexCount {

            var vertex = mesh.vertex(at: i)
            let dis = distance(a: _startPoint, b: vertex.from)
            let myDistance = dis

            let hEdgeDistance = min(vertex.from.x, 1 - vertex.from.x)
            let vEdgeDistance = min(vertex.from.y, 1 - vertex.from.y)
            let hProtection = min(30, pow(hEdgeDistance * 30, 0))/30
            let vProtection = min(30, pow(vEdgeDistance * 30,0))/30

            if (myDistance < dragDistance) {

                let maxDistort = CGPoint(x:(_endPoint.x - _startPoint.x) / 10,
                                         y:(_endPoint.y - _startPoint.y) / 10)

                let normalizedDistance = myDistance/dragDistance
                let normalizedImpact = (cos(normalizedDistance * .pi) + 1)

                vertex.to.x += maxDistort.x * normalizedImpact * hProtection
                vertex.to.y += maxDistort.y * normalizedImpact * vProtection

                mesh.replaceVertex(at: i, with: vertex)
            }
        }

        return mesh
    }

id = 1的帐单包含2个LineItems:

{
   stockId
   quantity
   rate
}

现在可以说我要更改| Stock Id | Qty | Rate | | 10 | 2 | 10 | | 11 | 3 | 20 | 并 我想更改quantity for stock Id : 10 to 5

我应该用 PUT 来表示吗?

rate for stock Id : 11 to 40

我应该用 PATCH 来表示吗?

bill : {
id : 1

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

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

还有其他参数,例如DiscountType,DiscountValue作为BillLineItem的一部分,在上面的示例中未显示。

2 个答案:

答案 0 :(得分:3)

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

  

PUT-收集资源的所有成员资源表示形式替换为请求正文中的表示形式,或者如果不存在则创建集合资源。
  PATCH-使用请求正文中的指令更新集合资源成员资源的所有表示形式,或者如果不创建集合资源,则可以创建存在。

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

答案 1 :(得分:1)

  

我们很困惑将其实现为PATCH或PUT。

PUTPATCH都具有远程创作语义;宽松地讲,这两个请求都是服务器将其资源副本更改为与客户端副本具有相同的表示形式。

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

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

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

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

但是,当资源非常大(意味着比HTTP标头大得多)并且您所做的更改的大小很小时,可能只将修订发送给表示形式,而不是发送整个事情。在这种情况下,使用PATCH可能是更好的选择。

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

相关问题