关于一个宁静的方式递增单个值的两个问题
比方说,我们有如下表。
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将是正确的解决方案。
所有的答案和意见赞赏,谢谢提前。
POST或补丁?
“这取决于”。 PATCH,像PUT,描述了一个变化中的一个未知的领域的方式表示。你是,实际上,告诉服务器“修改资源的副本,以便它看起来像这样。
大多数PATCH格式不提供一个“增量”操作;你得到的是set
或replace语义(就像放的真)。在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一个单一的资源。