type A struct {
Id int64
Email sql.NullString
Phone sql.NullString
}
假设我在数据库中有一条记录。
A{1, "x@x.com", "1112223333"}
通过PUT发送更新请求
curl -X PUT -d '{"Email": "y@y.com", "Phone": null}' http://localhost:3000/a/1
以下是一个伪代码算法,适用于全量PUT请求(即更新记录A的所有字段),但它可能会在PATCH请求语义中导致困难(增量更新)。
-- 将json解码为空记录
a := A{}
json.Unmarshal([]byte(request.body), &a)
-- 从数据库加载记录
aFromDb = <assume we got record from db> //A{1, "x@x.com", "1112223333"}
-- 比较 a 和 aFromDB
-- 注意电子邮件更改并在 aFromDb 上设置它 - 好的
-- 注意电话号码更改 - 但是等等!在 JSON 中它被显式地设置为 NULL 还是根本没有包括在 JSON 中?即,JSON 请求是 {"Email": "y@y.com", "Phone": null} 还是 {"Email": "y@y.com"}?
我们如何仅查看未解组合成结构体 a 后就能判断呢?
是否有另一种使用 REST 进行更新的方法(具有修补程序语义)?我正在寻找一种通用的方式来实现它(不绑定到特定的结构体)。