이전 포스트 바로가기
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")
}
'Go' 카테고리의 다른 글
[Go] 인터페이스(Interface) (0) | 2022.03.05 |
---|---|
[go/gin/gorm] Basic REST API 만들기 튜토리얼 (4) (0) | 2021.12.21 |
[go/gin] Basic REST API 만들기 튜토리얼 (3) (0) | 2021.12.18 |
[go/gin] Basic REST API 만들기 튜토리얼 (1) : 서버 실행 및 데이터 바인딩 (0) | 2021.12.16 |
<Tucker의 Go 언어 프로그래밍> Done 리스트 (1회독) (0) | 2021.12.15 |