본문 바로가기
Go

[go/gin] Basic REST API 만들기 튜토리얼 (2) : 데이터 바인딩

by weero 2021. 12. 16.

 

이전 포스트 바로가기

https://dev2som.tistory.com/152

 

[Go/Gin] Basic REST API 만들기 (1)

IDE : Goland(고랜드) 이라는 책을 참고해 Go 언어로 웹 서버를 만들어보려 한다. (웹에 대한 기본 지식을 전제함) 책에는 Gin 프레임워크에 대한 내용은 없어서 따로 찾아보면서 진행했다. (REST API in G

dev2som.tistory.com

 

 

이번 포스트에서는 request의 데이터 바인딩하는 방법에 대해 알아보려 한다.

 

 

 

01.Query String

type user struct {
	Id   int    `form:"id"`
	Name string `form:"name"`
	Email string `form:"email"`
}

func main() {
	r := gin.Default() // default settings
	r.GET("/user", func(c *gin.Context) {
		var userObj user
		if err := c.ShouldBindQuery(&userObj); err == nil {
			fmt.Printf("user obj - %+v \n", userObj)
		} else {
			fmt.Printf("error - %+v \n", err)
		}
		c.JSON(http.StatusOK, gin.H{
			"status" : "ok",
			"data": userObj,
		})
	})

	r.Run("localhost:8080")
}

ShouldBindQuery() 함수를 사용해 쿼리 스트링의 데이터를 바인딩할 수 있다.

 

실행 결과

테스트할 때는 GET 함수이므로 Params에 담아주거나, uri를 직접 수정해보는 방식으로 테스트한다.

 

 

 

02. JSON

type user struct {
	Id   int    `json:"id"`
	Name string `json:"name"`
	Email string `json:"email"`
}

...

	r.POST("/user", func(c *gin.Context) {
		var userObj user
		if err := c.ShouldBindJSON(&userObj); err == nil {
			fmt.Printf("user obj - %+v \n", userObj)
		} else {
			fmt.Printf("error - %+v \n", err)
		}
		c.JSON(http.StatusOK, gin.H{
			"status" : "ok",
			"data": userObj,
		})
	})

ShouldBindJSON() 함수를 사용한다.

 

테스트 시에는 Body에 json 형식으로 데이터를 담아준다.

 

 

 

03. URI

type user struct {
	Id   int    `uri:"id"`
	Name string `uri:"name"`
	Email string `uri:"email"`
}

...

	r.PUT("/user/:id/:name/:email", func(c *gin.Context) {
		var userObj user
		if err := c.ShouldBindUri(&userObj); err == nil {
			fmt.Printf("user obj - %+v \n", userObj)
		} else {
			fmt.Printf("error - %+v \n", err)
		}
        
		c.JSON(http.StatusOK, gin.H{
			"status" : "ok",
			"data": userObj,
		})
	})

 

이 경우 /user 뒤의 슬래시(/)가 총 3개가 아니라면 404 에러가 나거나 원하는 결과가 나오지 않을 수 있다.

 

 

 

 

 

04. Header

header 

type user4 struct {
	Id   int    `header:"id"`
}

...

	r.PUT("/user", func(c *gin.Context) {
		var userObj user4
		if err := c.ShouldBindHeader(&userObj); err == nil {
			fmt.Printf("user obj - %+v \n", userObj)
		} else {
			fmt.Printf("error - %+v \n", err)
		}

		c.JSON(http.StatusOK, gin.H{
			"status" : "ok",
			"data": userObj,
		})
	})

 

 

 

 

전체 코드

package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"net/http"
)

type user1 struct {
	Id   int    `form:"id"`
	Name string `form:"name"`
	Email string `form:"email"`
}
type user2 struct {
	Id   int    `json:"id"`
	Name string `json:"name"`
	Email string `json:"email"`
}
type user3 struct {
	Id   int    `uri:"id"`
	Name string `uri:"name"`
	Email string `uri:"email"`
}
type user4 struct {
	Id   int    `header:"id"`
}

func main() {
	r := gin.Default() // default settings
	r.GET("/user", func(c *gin.Context) {
		var userObj user1
		if err := c.ShouldBindQuery(&userObj); err == nil {
			fmt.Printf("user obj - %+v \n", userObj)
		} else {
			fmt.Printf("error - %+v \n", err)
		}
		c.JSON(http.StatusOK, gin.H{
			"status" : "ok",
			"data": userObj,
		})
	})
	r.POST("/user", func(c *gin.Context) {
		var userObj user2
		if err := c.ShouldBindJSON(&userObj); err == nil {
			fmt.Printf("user obj - %+v \n", userObj)
		} else {
			fmt.Printf("error - %+v \n", err)
		}
		c.JSON(http.StatusOK, gin.H{
			"status" : "ok",
			"data": userObj,
		})
	})
	r.PUT("/user/:id/:name/:email", func(c *gin.Context) {
		var userObj user3
		if err := c.ShouldBindUri(&userObj); err == nil {
			fmt.Printf("user obj uri binding - %+v \n", userObj)
		} else {
			fmt.Printf("error - %+v \n", err)
		}

		c.JSON(http.StatusOK, gin.H{
			"status" : "ok",
			"data": userObj,
		})
	})
	r.PUT("/user", func(c *gin.Context) {
		var userObj user4
		if err := c.ShouldBindHeader(&userObj); err == nil {
			fmt.Printf("user obj - %+v \n", userObj)
		} else {
			fmt.Printf("error - %+v \n", err)
		}

		c.JSON(http.StatusOK, gin.H{
			"status" : "ok",
			"data": userObj,
		})
	})

	r.Run("localhost:8080")
}