PATCH VS POST - 增加计数器

问题描述 投票:0回答:1

关于一个宁静的方式递增单个值的两个问题

比方说,我们有如下表。

public class EmployeeStatistics   
{      
    public int Id { get; set; }
    public int EmployeeId { get; set; }
    public int CallsMade { get; set; }
    public int CallsRecieved { get; set; }
}

问题1

什么是递增CallsMade场正确的格式?

答:api/EmployeeStatistics/AddCallMade/EmpId/{empId}

B:api/EmployeeStatistics/EmpId/{empId}/AddCallMade

问题2

POST或补丁?

有相互矛盾的答案,关于这个问题在网上。

虽然补丁是用来代替具体数值,我不希望提供包含最终值的有效载荷,而我想触发递增指定值,并在完成时返回状态代码200服务器端事件。

如果我的理解是正确的,递增的值作为结果每次运行操作时的变化不是幂等。这使我相信POST将是正确的解决方案。

所有的答案和意见赞赏,谢谢提前。

rest restful-url
1个回答
1
投票

POST或补丁?

“这取决于”。 PATCH,像PUT,描述了一个变化中的一个未知的领域的方式表示。你是,实际上,告诉服务器“修改资源的副本,以便它看起来像这样。

大多数PATCH格式不提供一个“增量”操作;你得到的是setreplace语义(就像放的真)。在JSON PATCH表示,你通常会看到这样的操作

{ "op": "replace", "path": "/CallsMade", "value": 42 }

或者,如果你想确保没有丢失编辑

{ "op": "test", "path": "/CallsMade", "value": 41 }
{ "op": "replace", "path": "/CallsMade", "value": 42 }

PATCH也有原子变化语义

服务器必须以原子方式应用整个集的变化的,从不提供(例如,响应于GET这个操作过程中)的部分修改的表示。

所以,如果你不能真正确保修改将是全有或全无;如果你不能把所有的改变成一个单一的“交易”,然后补丁是错误的想法。

这就是说,一切都可以用PATCH做也可以用POST完成 - POST只是提供较少的保证。

什么是递增CallsMade场正确的格式?

PATCH,就像放和DELETE,描述了改变资源的表示。通常的节奏会是这样的

GET /X
(edit)
PATCH /X

REST不关心你用你的标识符,因此所有下列选项都可以接受什么样的拼写

api/EmployeeStatistics/AddCallMade/EmpId/{empId}
api/EmployeeStatistics/EmpId/{empId}/AddCallMade
api/EDA9E9D4-EC6D-4884-91A6-F15BCE88D060

我们通常使用path segments分层数据,所以你可能会使用目标URI这样,如果消费者正期待编辑整个EmployeeStatistic实体

api/EmployeeStatistics/{empId}

或目标URI这样的,如果你想提供的资源有限,只是与呼叫相关的信息来进行

api/EmployeeStatistics/{empId}/callsMade

你的消费者的caches结果不太一样,所以你需要仔细考虑你的资源的晶粒。

随着POST ......嗯,跟你POST可以做几乎所有的东西;它的HTTP方法一开始出的自由监狱卡。还有缓存的影响,但并没有什么根本性的错误具有可以增加任何员工的callsMade一个单一的资源。

© www.soinside.com 2019 - 2024. All rights reserved.