补丁与开机自检-增量计数器

时间:2018-09-21 03:47:24

标签: rest restful-url

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

假设我们有下表。

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字段的正确格式是什么?

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

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

问题2

POST或PATCH?

关于此问题,在线答案存在冲突。

虽然PATCH用于替换特定值,但我不希望提供包含最终值的有效负载,而是希望触发服务器端事件,该事件将增加指定值并返回状态代码{{1} }。

如果我的理解是正确的,则每次操作运行时结果都会改变,因此增加值不是幂等的。这使我相信POST将是正确的解决方案。

感谢所有答复和意见,谢谢。

1 个答案:

答案 0 :(得分:1)

  

POST或PATCH?

“取决于”。 PATCHPUT一样,以域不可知的方式描述对表示形式的更改。实际上,您是在告诉服务器“修改资源副本,使其看起来像 this

大多数PATCH格式不提供“递增”操作;您得到的是setreplace语义(就像PUT一样)。以JSON PATCH表示,通常会看到类似

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

或者,如果您尝试确保没有丢失的修改,则

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

PATCH也具有原子更改语义

  

服务器必须自动应用整个更改集,并且绝不提供(例如,在此操作期间响应GET的)部分修改的表示形式。

因此,如果您实际上不能确保所做的更改将全部或全部消失;如果您不能将所有更改都放在一个“事务”中,那么PATCH是错误的主意。

也就是说,您可以使用PATCH进行的所有操作也可以通过POST完成-POST仅提供较少的保证。

  

增加CallsMade字段的正确格式是什么?

PATCH与PUT和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来存储分层数据,因此,如果消费者希望编辑整个EmployeeStatistic实体,则可以使用这样的目标URI

api/EmployeeStatistics/{empId}

或类似的目标URI,如果您想提供的资源仅限于与通话相关的信息

api/EmployeeStatistics/{empId}/callsMade

消费者caches上的结果并不完全相同,因此您需要仔细考虑资源的数量。

使用POST ...好吧,使用POST,您几乎可以做任何事;这是HTTP方法的无拘无束卡。仍然存在缓存问题,但是拥有单个资源可以增加任何员工的需求量从根本上没有错。