关于以宁静的方式递增单个值的两个问题
假设我们有下表。
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将是正确的解决方案。
感谢所有答复和意见,谢谢。
答案 0 :(得分:1)
POST或PATCH?
“取决于”。 PATCH与PUT一样,以域不可知的方式描述对表示形式的更改。实际上,您是在告诉服务器“修改资源副本,使其看起来像 this 。
大多数PATCH格式不提供“递增”操作;您得到的是set
或replace语义(就像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方法的无拘无束卡。仍然存在缓存问题,但是拥有单个资源可以增加任何员工的需求量从根本上没有错。