Go. Gin Framework

JINSOO PARK·2021년 11월 10일
0

Go. Gin Framework

목록 보기
1/1
post-thumbnail

Gin Framework

다운로드

터미널에서

go get github.com/gin-gonic/gin

실행



1. 간단한 서버 만들기

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()
}


Gin 엔진 만들기 (Gin 라우터)

r := gin.Default()
r := gin.New()

Default() 함수로 Gin 엔진을 만든다. 로거 없는 엔진을 사용 하려면 New() 함수를 사용한다.


URI 바인딩

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()
}

결과는 모두 같음



2. 요청 읽기

핸들러 함수로 전달된 컨텍스트를 통해 클라이언트가 보낸 http 요청을 파싱할 수 있다.

func(c *gin.Context){
    // 요청 처리
    // 응답 처리
}

URI 파라미터

바인딩한 URI정보를 얻는 방법

r.GET("/user/:name/*action", func(c *gin.Context){
	name := c.Param("name")
	action := c.Param("action")
})

// name = jhon
// action = info

Param() 함수로 URI 파라미터를 읽는다.


URI Query

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() 함수로 요청 헤더를 읽는다.


PostForm

r.GET("/welcom", func(c *gin.Context){
	requestPath := c.PostForm("path")
	name := c.DefaultPostForm("name", "Guest")
	email, inInputed := c.GetPostForm("email")
})

POST 요청 시 Form 정보를 읽을 때 사용



3. 응답 하기

핸들러 함수로 전달된 컨텍스트를 통해 클라이언트에게 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

JSON 응답


JSON

// 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을 쉽게 사용할 수 있다.


IndenteJSON

JSON 파일을 들여쓰기, 줄 넘김 처리를 해서 응답한다. 'JSON()"과 동일하게 사용


SecureJSON

JSON 문자열 앞에 while(1); 을 붙여준다. JSON 하이제킹을 방지하고 JSON()과 동일하게 사용


JSONP

외부 철처에서 데이터를 받아오는 것의 응답을 처리할 때 사용한다.

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)
})

PureJSON

JSON()은 '<' 를 \u003c 처럼 특수 HTML 문자를 유니코드로 치환한다. PureJSON은 이런한 작업 없이 JSON을 응답한다.


AsciiJSON

아스키 문자로만 이루어진 JSON을 응답 한다.


XML

JSON()과 같으나 XML 형식으로 응답 한다.


String

c.String(http.StatusOK, "hello %s", "jinsoo")

단순 문자열을 리턴 한다. Printf처럼 포맷을 사용할 수 있다.


Redirect

c.Redirect(http.StatusMovedPermanently, "https://jinsoo456.com")

리다이렉트 응답, 30X 응답 코드랑 사용 한다.


Data

c.Data(http.StatusOK, "text/html", []byte("<html></html"))

[]byte 응답시 사용한다. 주로 파일 응답에 사용 되며 두번째 인자로 Content-Type을 받는다.


HTML

https://gin-gonic.com/docs/examples/html-rendering/


YAML

JSON() 과 같으나, YAML형식으로 응답 합니다.


ProtoBuf

https://gin-gonic.com/docs/examples/rendering/

profile
개린이

0개의 댓글

관련 채용 정보