前提
GinでREST APIを作っています。例として投稿を意味するpostsというリソースを使います。
投稿は以下のような構造体です。
go
1import ( 2 "time" 3) 4 5type Post struct { 6 ID string 7 Title string 8 Content string 9 CreatedAt time.Time 10 UpdatedAt time.Time 11}
/posts/:id
にPATCHする際、以下のようにリクエストボディをバインドします(わかりやすさのため処理をmain
にまとめてます。)
go
1import ( 2 "github.com/gin-gonic/gin" 3) 4 5type PostUpdateInput struct { 6 Title string `json:"title"` 7 Content string `json:"content"` 8} 9 10func main() { 11 r := gin.Default() 12 r.PATCH("/posts/:id", func (c *gin.Context){ 13 params := PostUpdateInput{} 14 if err := c.ShouldBindJSON(¶ms); err != nil { 15 c.Writer.WriteHeader(500) 16 return 17 } 18 // 以下更新処理 19 }) 20 // 以下略 21}
解決したいこと
まず以下のような投稿があったとします。
json
1{ 2 "id": "xxxx", 3 "title": "Hello world!", 4 "content": "Example post" 5}
ここで以下のJSONを/posts/xxxx
にPATCHで送って投稿を部分更新したいです。
json
1{ 2 "title": "Hello Japan!" 3}
しかしこの時、PostUpdateInput
型の変数params
のContent
フィールドは初期化されたままなのでstring
のゼロ値、つまり空文字なので更新処理はContent
が
- 空文字として入力されたものか
- 初期化されたものか
区別できないので、この投稿を以下のように更新してしまいます。
json
1{ 2 "id": "xxxx", 3 "title": "Hello Japan!", 4 "content": "" 5}
これをうまく処理する方法はありますか?
ご存知の方、教えていただけると幸いです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/08/29 02:21