[Go] REST APIで部分更新するときゼロ値で詰む
解決したいこと
GinでREST APIを作っています。例として投稿を意味するpostsというリソースを使います。
投稿は以下のような構造体です。
import (
"time"
)
type Post struct {
ID string
Title string
Content string
CreatedAt time.Time
UpdatedAt time.Time
}
/posts/:id
にPATCHする際、以下のようにリクエストボディをバインドします(わかりやすさのため処理をmain
にまとめてます。)
import (
"github.com/gin-gonic/gin"
)
type PostUpdateInput struct {
Title string `json:"title"`
Content string `json:"content"`
}
func main() {
r := gin.Default()
r.PATCH("/posts/:id", func (c *gin.Context){
params := PostUpdateInput{}
if err := c.ShouldBindJSON(¶ms); err != nil {
c.Writer.WriteHeader(500)
return
}
// 以下更新処理
})
// 以下略
}
まず以下のような投稿があったとします。
{
"id": "xxxx",
"title": "Hello world!",
"content": "Example post"
}
ここで以下のJSONを/posts/xxxx
にPATCHで送って投稿を部分更新したいです。
{
"title": "Hello Japan!"
}
しかしこの時、params
のContent
フィールドはstring
のゼロ値、つまり空文字なので更新処理はContent
が空文字として入力されたものか初期化されたものか区別できないので、この投稿を以下のように更新してしまいます。
{
"id": "xxxx",
"title": "Hello Japan!",
"content": ""
}
これをうまく処理する方法はありますか?
ご存知の方、教えていただけると幸いです。
2