Go Gin Framework 시작하기(설치 및 API 테스트)
2020, Sep 22
설치 환경
- OS : Window 10 Pro
- Go Version : 1.15.2 windows/amd64
공식문서
(공식문서 예제들을 가져왔지만 전부는 아니기 때문에 다른 예제들은 직접 접속해서 참고하기 바란다)
gin 설치
- 명령 프롬프트가 관리자 모드로 실행을 안해서 설치가 안되는 경우도 있음
go get -u github.com/gin-gonic/gin
Quick start
main.go
파일 내용
package main
import "github.com/gin-gonic/gin"
func main() {
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
})
r.Run() // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}
go run main.go
로 서버를 실행시켜 준다.
[GIN-debug] GET /ping --> main.main.func1 (3 handlers)
[GIN-debug] Environment variable PORT is undefined. Using port :8080 by default
[GIN-debug] Listening and serving HTTP on :8080
[GIN] 2020/09/22 - 17:47:36 | 200 | 0s | ::1 | GET "/ping"
- Postman으로
[localhost:8080/ping](http://localhost:8080/ping)
를 요청해서 결과값message:"pong"
확인
HTTP 메서드 예제
GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONS
해당 HTTP 메서드를 아래와 같이 사용하면 된다는 것을 참고하면 된다. (종류만 확인하고 넘어가면 될 것 같다)
func main() {
// Creates a gin router with default middleware:
// logger and recovery (crash-free) middleware
router := gin.Default()
router.GET("/someGet", getting)
router.POST("/somePost", posting)
router.PUT("/somePut", putting)
router.DELETE("/someDelete", deleting)
router.PATCH("/somePatch", patching)
router.HEAD("/someHead", head)
router.OPTIONS("/someOptions", options)
// By default it serves on :8080 unless a
// PORT environment variable was defined.
router.Run()
// router.Run(":3000") for a hard coded port
}
Path 파라미터
- Path 파라미터란 URL 자체 경로에 들어있는 파라미터를 말함
//main 함수 중간에 해당 내용 추가 (ping과 r.Run 사이에 추가하면 됨)
r.GET("/user/:name", func(c *gin.Context) {
name := c.Param("name")
c.String(http.StatusOK, "Hello %s", name)
})
- Postman으로
[localhost:8080/user/hamletshu](http://localhost:8080/welcome?lastname=Hamlethsu)
와 같이 요청을 보낸다. (아래와 같은Hello Hamlethsu
결과값을 확인할 수 있다)
Querystring 파라미터
- Querystring 파라미터란 URL 뒤에 물음표를 붙여서
[http://localhost:8080?lastname=Hamletshu](http://localhost:8080?lastname=Hamletshu)
이런식으로 넘오는 파라미터를 말함
//main 함수 중간에 해당 내용 추가 (ping과 r.Run 사이에 추가하면 됨)
r.GET("/welcome", func(c *gin.Context) {
firstname := c.DefaultQuery("firstname", "Guest")
lastname := c.Query("lastname") // shortcut for c.Request.URL.Query().Get("lastname")
c.String(http.StatusOK, "Hello %s %s", firstname, lastname)
})
- Postman으로
[localhost:8080/welcome?lastname=Hamlethsu](http://localhost:8080/welcome?lastname=Hamlethsu)
와 같이 요청을 보낸다. (아래와 같은Hello Guest Hamlethsu
결과값을 확인할 수 있다)
Multipart/Urlencoded Form
//main 함수 중간에 해당 내용 추가 (ping과 r.Run 사이에 추가하면 됨)
r.POST("/form_post", func(c *gin.Context) {
message := c.PostForm("message")
nick := c.DefaultPostForm("nick", "anonymous")
c.JSON(200, gin.H{
"status": "posted",
"message": message,
"nick": nick,
})
})
- Postman에서
POST
방식으로form-data
message
키 값에hellow Go Gin
값을 파라미터를 보낸다. (아래와 같은 값들이 넘어오는 것을 확인할 수 있다)
{
"message": "hellow Go Gin",
"nick": "anonymous",
"status": "posted"
}
Query + Post Form
- Querystring과 form data를 둘다 보낼 때이다.
import "fmt"
를 해주어야 Printf 함수를 사용할 수 있고 에러가 발생하지 않음
//main 함수 중간에 해당 내용 추가 (ping과 r.Run 사이에 추가하면 됨)
r.POST("/post", func(c *gin.Context) {
id := c.Query("id")
page := c.DefaultQuery("page", "0")
name := c.PostForm("name")
message := c.PostForm("message")
fmt.Printf("id: %s; page: %s; name: %s; message: %s", id, page, name, message)
})
- Postman에서는 요청을 보내도 별다른 것을 확인할 수 없지만 로그에서 아래와 같은 결과를 확인할 수 있다.
id: 1234; page: 1; name: manu; message: this_is_great[GIN] 2020/09/22 - 18:30:35 | 200 | 0s | ::1 | POST "/post?id=1234&page=1"
Map as querystring or postform parameters
import "fmt"
를 해주어야 Printf 함수를 사용할 수 있고 에러가 발생하지 않음
r.POST("/post-map", func(c *gin.Context) {
ids := c.QueryMap("ids")
names := c.PostFormMap("names")
fmt.Printf("ids: %v; names: %v", ids, names)
})
- Postman에서는 요청을 보내도 별다른 것을 확인할 수 없지만 로그에서 아래와 같은 결과를 확인할 수 있다.
ids: map[a:1234 b:hello]; names: map[][GIN] 2020/09/22 - 18:52:22 | 200 | 0s | ::1 | POST "/post-map?ids[a]=1234&ids[b]=hello"