網頁

2021/7/8

Golang Gin Model binding json to type

Gin可使用Model binding將request body的json資料轉為指定的型態。


範例環境:

  • Go 1.16
  • Gin 1.7.2

Gin在設定API路徑時使用gin.ContextShouldBindJSON()傳入型態指標來取得json轉成的值。

例如下面的APIPOST | /add會將接收的json資料轉為Employee

main.go

package main

import (
    "log"
    "net/http"
    "strconv"

    "github.com/gin-gonic/gin"
)

type Employee struct {
    Id   int
    Name string
    Age  int
}

func (e Employee) String() string {
    return "Employee={" +
        "Id=" + strconv.Itoa(e.Id) + "," +
        "Name=" + e.Name + "," +
        "Age=" + strconv.Itoa(e.Age) +
        "}"
}

func main() {
    router := gin.Default()

    router.POST("/add", func(c *gin.Context) {
        var emp Employee // declare 
        err := c.ShouldBindJSON(&emp) // pass as pointer
        if err != nil {
            c.String(http.StatusBadRequest, "error")
            return
        }

        log.Println(emp)
        c.String(http.StatusOK, emp.String())
    })

    router.Run()
}

啟動專案用curl命令發送http request。參數-H--header,用來設定HTTP headers-d--data,用來設定json資料。執行結果如下。

$ curl -X POST http://localhost:8080/add \
> -H 'content-type: application/json' \
> -d '{"id": 1, "name": "john", "age": 33}'
Employee={Id=1,Name=john,Age=33}

若某個屬性為必填,則在屬性後面加上go-playground/validator的validator tag`binding:"required"`,例如把Employee.Name改為必填如下。

type Employee struct {
    Id   int
    Name string `binding:"required"`
    Age  int
}

則以curl發送request時若json少了該屬性,則ShouldBindJSON()會返回錯誤,執行結果如下。

$ curl -X POST http://localhost:8080/add \
> -H 'content-type: application/json' \
> -d '{"id": 1, "age": 33}'
error


沒有留言:

張貼留言