Gin Framework
터미널에서
go get github.com/gin-gonic/gin
실행
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()
}
r := gin.Default()
r := gin.New()
Default() 함수로 Gin 엔진을 만든다. 로거 없는 엔진을 사용 하려면 New() 함수를 사용한다.
r.GET("/url/path", handleFunc)
r.POST("/url/path", handleFunc)
r.HEAD("/url/path", handleFunc)
r.OPTIONS("/url/path", handleFunc)
r.PUT("/url/path", handleFunc)
r.DELETE("/url/path", handleFunc)
r.Handle("GET", "/url/path", handleFunc)
위와 같이 라우팅을 설정한다.
첫 번째 인자로 라우팅 할 URL을 , 두번째 인자로 핸들 함수를 넣어준다.
r.GET("/user/:name", ... )
r.GET("/user/:name/*action", ... )
r.GET("/user/groups", ... )
*/user/jhon, /jser/chris 에 매칭 된다.
/user/jhon/, /user/jhon/info, /user/jhon/info/age 에 매칭 된다.
/user/groups 는 1번에 매칭되지 않고, 본 함수에 매칭 됩니다.
ex1) 핸들러 함수 선언
func main() {
r := gin.New()
r.GET("/url/path", handleFunc)
r.Run() // listen and serve on :8080
}
func handleFunc(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"message": "ok",
})
}
ex2) 익명 함수 사용
func main() {
r := gin.New()
handleFunc := func(c *gin.Context){
c.JSON(http.StatusOK, gin.H{
"messge":"ok",
})
}
r.GET("/url/path", handleFunc)
r.Run() // listen and serve on :8080
}
ex3) 인 라인 사용
func main() {
r := gin.New()
r.GET("/url/path", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"message": "ok",
})
})
r.Run()
}
결과는 모두 같음
핸들러 함수로 전달된 컨텍스트를 통해 클라이언트가 보낸 http 요청을 파싱할 수 있다.
func(c *gin.Context){
// 요청 처리
// 응답 처리
}
바인딩한 URI정보를 얻는 방법
r.GET("/user/:name/*action", func(c *gin.Context){
name := c.Param("name")
action := c.Param("action")
})
// name = jhon
// action = info
Param() 함수로 URI 파라미터를 읽는다.
r.GET("/welcom", func(c *gin.Context){
firstname := c.DefaultQuery("firstname", "Guest")
lastname := c.Query("lastname")
pw, isInputed := c.GetQuery("password")
})
DefaultQuery()는 Query가 없을 시 미리 설정한 Default값을 리턴한다.
Query() 함수는 Query가 없을 시 ("",false),
Query 값이 없을 시 ("", true),
Query 값이 존재 시 ("value", true)를 리턴한다.
ex)
// GET/?name=Manu&lastname=
("Manu", ture) == c.GetQuery("name")
("", false) == c.GetQuery("id")
("", "ture") == c.GetQuery("lastname")
GET을 했을때 name과 값이 존재함 ("Manu",true)
id는 쿼리가 없으므로("", false)
lastname은 쿼리는 있지만 값이 없으므로("",true)
r.GET("/welcom", func(c *gin.Context){
requestContent := c.GetHeader("Content-Type")
})
GetHeader() 함수로 요청 헤더를 읽는다.
r.GET("/welcom", func(c *gin.Context){
requestPath := c.PostForm("path")
name := c.DefaultPostForm("name", "Guest")
email, inInputed := c.GetPostForm("email")
})
POST 요청 시 Form 정보를 읽을 때 사용
핸들러 함수로 전달된 컨텍스트를 통해 클라이언트에게 http 응답을 할 수 있다.
func(c *gin.Context){
// 요청 처리
// 응답 처리
}
핸들러 함수 인자인 c *gin.Context를 사용 한다.
// JSON
c.JSON()
// 들여쓰기 처리 JSON
c.IndentedJSON()
// JSON 하이제킹 방지 처리
c.SecureJSON()
// JSONP 응답 처리
c.JSONP()
// 특수 html 문자를 유니코드로 대체하지 않음.
c.PureJSON()
// ASCII only JSON
AsciiJSON()
// XML
c.XML()
// String 문자열 응답 Printf 처럼 사용
c.String()
// Redirect 응답
c.Redirect()
// []byte 응답
c.Data()
// Html 템플릿 렌더링 응답
c.HTML()
// YAML 응답
c.YAML()
// ProtoBuf 응답
c.ProtoBuf()
위의 함수는 첫번째 인자로 http응답 코드를 넣어주어야 한다.
const (
StatusContinue = 100 // RFC 7231, 6.2.1
StatusSwitchingProtocols = 101 // RFC 7231, 6.2.2
StatusProcessing = 102 // RFC 2518, 10.1
StatusEarlyHints = 103 // RFC 8297
StatusOK = 200 // RFC 7231, 6.3.1
StatusCreated = 201 // RFC 7231, 6.3.2
StatusAccepted = 202 // RFC 7231, 6.3.3
StatusNonAuthoritativeInfo = 203 // RFC 7231, 6.3.4
StatusNoContent = 204 // RFC 7231, 6.3.5
StatusResetContent = 205 // RFC 7231, 6.3.6
...
//
200 == http.StatusOK
// Map 사용
c.JSON(http.StatusOK, gin.H{
"message": "ok",
})
// 구조체 사용
var msg struct {
Name string `json:"user"`
Message string
Number int
}
msg.Name = "error"
msg.Name = "bad request"
msg.Number = 0
c.JSON(http.StatusBadRequest, msg)
gin.H는
gin.H 를 사용하면 Map을 쉽게 사용할 수 있다.
JSON 파일을 들여쓰기, 줄 넘김 처리를 해서 응답한다. 'JSON()"과 동일하게 사용
JSON 문자열 앞에 while(1); 을 붙여준다. JSON 하이제킹을 방지하고 JSON()과 동일하게 사용
외부 철처에서 데이터를 받아오는 것의 응답을 처리할 때 사용한다.
r.GET("/JSONP?callback=x", func(c *gin.Context) {
data := map[string]interface{}{
"foo": "bar",
}
//callback is x
// Will output : x({\"foo\":\"bar\"})
c.JSONP(http.StatusOK, data)
})
JSON()은 '<' 를 \u003c 처럼 특수 HTML 문자를 유니코드로 치환한다. PureJSON은 이런한 작업 없이 JSON을 응답한다.
아스키 문자로만 이루어진 JSON을 응답 한다.
JSON()과 같으나 XML 형식으로 응답 한다.
c.String(http.StatusOK, "hello %s", "jinsoo")
단순 문자열을 리턴 한다. Printf처럼 포맷을 사용할 수 있다.
c.Redirect(http.StatusMovedPermanently, "https://jinsoo456.com")
리다이렉트 응답, 30X 응답 코드랑 사용 한다.
c.Data(http.StatusOK, "text/html", []byte("<html></html"))
[]byte 응답시 사용한다. 주로 파일 응답에 사용 되며 두번째 인자로 Content-Type을 받는다.
https://gin-gonic.com/docs/examples/html-rendering/
JSON() 과 같으나, YAML형식으로 응답 합니다.