Gin可使用Model binding將request body的json資料轉為指定的型態。
範例環境:
- Go 1.16
- Gin 1.7.2
Gin在設定API路徑時使用gin.Context
的ShouldBindJSON()
傳入型態指標來取得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
沒有留言:
張貼留言