golang-使用http修补程序语义的Rest更新请求

golang-使用http修补程序语义的Rest更新请求,go,Go,假设数据库中有一条记录 type A struct { Id int64 Email sql.NullString Phone sql.NullString } a := A{} json.Unmarshal([]byte(request.body), &a) 通过PUT发送更新请求 A{1, "x@x.com", "1112223333"} 以下是psuedo算法,该算法可用于完整PUT请求(即更新记录a的所有字段-但这将导致补丁请求语义出现困难-

假设数据库中有一条记录

type A struct {
    Id int64
    Email sql.NullString
    Phone sql.NullString
}
  a := A{}
  json.Unmarshal([]byte(request.body), &a)
通过PUT发送更新请求

A{1, "x@x.com", "1112223333"}
以下是psuedo算法,该算法可用于完整PUT请求(即更新记录a的所有字段-但这将导致补丁请求语义出现困难-增量更新)

--将json解组为空记录

curl -X PUT -d '{"Email": "y@y.com", "Phone": null}' http://localhost:3000/a/1 
--从数据库加载记录

type A struct {
    Id int64
    Email sql.NullString
    Phone sql.NullString
}
  a := A{}
  json.Unmarshal([]byte(request.body), &a)
aFromDb=//A{1,“x@x.com", "1112223333"}
--比较a和MDB

--注意电子邮件更改并将其设置为MDB-ok

--请注意电话号码的变化,但请稍候!是在JSON中显式地设置为NULL,还是甚至没有包含在JSON中?i、 e.json请求是否为{“电子邮件”:y@y.com“,“Phone”:null}还是{“Email”:”y@y.com“}

我们如何通过查看结构a中未经签名的json来判断呢


是否有其他方法通过rest进行更新(使用补丁语义)?我正在寻找一种通用方法(不绑定到特定结构)。

尝试将此标记添加到结构:

aFromDb = <assume we got record from db> //A{1, "x@x.com", "1112223333"}
这样,如果您正在序列化并且字段为空,那么json将不包含该字段


进行反序列化时,字段将具有a值或类型的默认值(指针为Nil,字符串为空字符串)

为此,我创建了一个单独的数据类型。此示例适用于int64(实际上是字符串编码的int64),但您也可以轻松地将其更改为字符串。其背后的思想是,只有在JSON中存在值时才会调用
UnmarshalJSON
方法。该类型将实现和


因此,如果
Set
为false,您就知道JSON中不存在该值。

您可能会编写自己的结构编组/ui编组,并对其中的原始响应做出反应,尽管这些函数正在操作什么可能并不明显

或者,不能在字段中省略empty并强制填充空字段


或者,也许可以利用不同的补丁风格,这在修改的本质上更加明确。这需要客户机比put更了解更改的状态。

谢谢-但是您能告诉我在解组期间这两个不同输入的结构值是多少吗-{“电子邮件”:y@y.com“,“Phone”:null}和{“Email”:”y@y.com"}? 从结构上看,我们能区分这两者吗?在一种情况下,客户端希望将电话设置为空。在另一种情况下,客户只想更新电子邮件并保持手机完整。