https://github.com/Microsoft/api-guidelines/blob/master/Guidelines.md#74-supported-methods和前面 Mozilla 的问答一样,微软的文档指出
PATCH ; Apply a partial update to an object ; Is Idempotent:False
关于 patch 还有一点,就是 patch 一般是提交多个字段:
例如我有个资源(或者数据库表),叫“离校请求”,有(学生 id,离校时长、离校原因、是否同意)几个字段。
那么,很容易想到的 patch 的请求就是 PATCH /离校请求 /123,body 是{离校时长:10 小时,离校原因:看病}。然后服务端在判断的时候,如果传过来的哪个字段不为 null,那么就代表客户端想要更新这个字段。这就做到了节省代码行数(只需写一个接口)。 当然,如果想要让客户端有能力将某个字段置为 null,就约定一个悬空值。
在这个场景中,对于“教师同意或拒绝离校申请”的功能,这个功能不是单纯的修改某一字段的值,还可能会有副作用,例如修改另外一个表“User”的“是否允许离校”字段。对此,有的人可能会单独开一个接口,例如`/离校请求 /11/处理请求`。
其实同意或拒绝离校申请这种也可以包含到 patch 请求体里面。
PATCH /离校请求 /11 。body 的 schema 就变成是:{离校时长:string?,离校原因:string?, 是否同意: bool? }。
这样的好处是节省代码,并且接口整洁。
当然,不同用户对于字段的权限不同,在 controller 代码里面应该是这样的结构:
``` cs
if body.离校时长!=null {
if 当前用户有权限修改离校市场{
修改离校时常
}
}
if body.离校原因 != null {
.........
}
保存更改
```