AdSense

網頁

2021/8/9

Golang Gin 轉Request body JSON為struct

Gin把傳入的請求payload JSON轉為struct。


範例環境:

  • Go 1.16
  • Gin 1.7.2

範例

DepartmentEmployee為JSON要轉成的struct。

model/department.go

package model

type Department struct {
    Id        int        `json:"id"`
    Name      string     `json:"name"`
    Employees []Employee `json:"employees"`
}

model/employee.go

package model

type Employee struct {
    Id   int    `json:"id"`
    Name string `json:"name"`
    Age  int    `json:"age"`
}

gin.Context.Bind()把struct的指標變數傳入接收轉換的JSON資料。

main.go

package main

import (
    "fmt"

    "abc.com/demo/model"
    "github.com/gin-gonic/gin"
)

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

    router.POST("/employee", demoHandler)

    router.Run(":8080")
}

func demoHandler(c *gin.Context) {
    var dep model.Department
    err := c.Bind(&dep)
    if err != nil {
        return
    }
    fmt.Printf("%v\n", dep)
    c.JSON(200, "success")
}

>github



測試

在命令列以cURL傳入JSON如下。

curl -X POST "http://localhost:8080/employee" \
-H 'content-type: application/json' \
-d '{"id": 100, "name": "HR", "employees": [{"id": 1, "name": "John", "age": 33}, {"id": 2, "name": "Mary", "age": 28}]}'

執行後會在console印出轉換後的struct變數dep內容。

{100 HR [{1 John 33} {2 Mary 28}]}


Bind()是依照Content-Typeapplication/json判斷傳入的payload為JSON格式,或是直接用BindJSON()指定傳入的payload為JSON格式。

此外也可用ShouldBind()ShouldBindJSON()來轉換,差別在於Bind()BindJSON()若解析JSON錯誤會把Response Header設為400。


沒有留言:

AdSense