我们具有库存功能,可在此生成账单。有一个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的一部分,在上面的示例中未显示。
答案 0 :(得分:3)
Wikipedia描述了HTTP方法与RESTful操作相对应的典型方式:
PUT
-将收集资源的所有成员资源表示形式替换为请求正文中的表示形式,或者如果不存在则创建集合资源。
PATCH
-使用请求正文中的指令更新集合资源成员资源的所有表示形式,或者如果不创建集合资源,则可以创建存在。
由于您要更新帐单项目的各个属性,而不是完全替换它们,因此PATCH
是合适的方法。
答案 1 :(得分:1)
我们很困惑将其实现为PATCH或PUT。
PUT和PATCH都具有远程创作语义;宽松地讲,这两个请求都是服务器将其资源副本更改为与客户端副本具有相同的表示形式。
PUT
是直接的“使您的副本像我在此请求中包含的副本一样”。 PATCH
是“将这些更改应用于您的副本”。
因此,PUT
是idempotent;同一请求的两个副本与单个请求的副本具有相同的效果。此语义提示在不可靠的网络上可能很重要-如果PUT
请求丢失,我们可以重新发送它。此外,关于重新发送消息安全的提示既是标准消息,也包含在消息本身中。这意味着任何看到该消息的 generic 组件都会知道重新发送是安全的。
PATCH
中没有内置幂等语义-如果丢失一条消息,则通用组件不知道该请求是否可以安全地重复,因此需要失败,而不是重试
对于PUT
来说,这是一个巨大的胜利。
但是,当资源非常大(意味着比HTTP标头大得多)并且您所做的更改的大小很小时,可能只将修订发送给表示形式,而不是发送整个事情。在这种情况下,使用PATCH
可能是更好的选择。
REST的部分要点是我们使用“易于标准化的形式”进行通信,因此,您应该尽可能支持标准化的补丁文档格式(application/json-patch+json或application/merge-patch+json),而不是而不是发明自己的定制表示形式。