don't stop believing

Map as querystring or postform parameters 본문

Golang/Gin

Map as querystring or postform parameters

Tongchun 2019. 2. 27. 10:48

query string이나 post로 넘기는 데이터를 map 형식으로 사용하는 것은 이번에 처음 알게 되었습니다.

https://github.com/gin-gonic/gin#map-as-querystring-or-postform-parameters


아래와 같이 ids[a]=123 그리고 ids[b]=hello 처럼 사용할 수 있습니다.

/post?ids[a]=1234&ids[b]=hello


마찬가지로 html의 form에서도 map 형식의 데이터를 넘길 수 있습니다.


이번에는 tamplate을 사용해 html 페이지를 실행하겠습니다.

먼저 tamplates라는 폴더를 만들고 그 안에 note.html 파일을 만들어 줍니다. 그리고 아래와 같이 작성합니다.

<html> <head> <title>Tongchun's go gin</title> </head> <body> <h2>page: {{ .page }}</h2> <form action="http://localhost:8080/postMap?ids[a]=1234&ids[b]=hello" method="POST"> first name: <input type="text" name="names[first]"> family name: <input type="text" name="names[second]"> <input type="submit" value="Submit"> </form> </body> </html>

tamplate에 대해서는 다음에 자세히 설명하도록 하겠습니다.

우선 form tag의 action은 위에서 설명했던 것 처럼 map 형식으로 되어 있습니다.

http://localhost:8080/postMap?ids[a]=1234&ids[b]=hello


input에는 first name과 family name 두 개를 입력하는데 input tag의 name에도 map type처럼 names[first]와 name[second]로 되어 있습니다.


server.go 파일에는 아래와 같이 작성합니다.

package main import ( "net/http" "github.com/gin-gonic/gin" ) func setupRouter() *gin.Engine { // Disable Console Color // gin.DisableConsoleColor() r := gin.Default() r.GET("/note", func(c *gin.Context) { title := "map type query string" c.HTML(http.StatusOK, "note.html", gin.H{ "page": title, }) }) r.POST("/postMap", postMap) return r } func postMap(c *gin.Context) { ids := c.QueryMap("ids") names := c.PostFormMap("names") c.JSON(200, gin.H{ "status": "posted", "ids": ids, "names": names, }) } func main() { r := setupRouter() // r.LoadHTMLGlob("/Users/tongchunkim/go/src/github.com/dejavuwing/example/templates/*") r.LoadHTMLGlob("./example/templates/*") // Listen and Server in 0.0.0.0:8080 r.Run(":8080") }

지난번과 다른 점은 main() 함수에서 아래와 같이 LoadHTMLGlob()함수가 추가되었습니다.

r.LoadHTMLGlob("./example/templates/*")

해당 경로에 있는 파일을 template html 파일로 설정하는 것입니다.

그리고 setupRouter() 함수 안에 GET method로 /note 경로를 받게 했습니다.

r.GET("/note", func(c *gin.Context) {

    title := "map type query string"

    c.HTML(http.StatusOK, "note.html", gin.H{

        "page": title,

    })

})

c.HTML()을 사용하면 template을 이용해 html 파일이 출력되게 됩니다.


server.go를 실행해 봅니다.

$ go run ./example/server.go 
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.

[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
 - using env:	export GIN_MODE=release
 - using code:	gin.SetMode(gin.ReleaseMode)

[GIN-debug] GET    /note                     --> main.setupRouter.func1 (3 handlers)
[GIN-debug] POST   /postMap                  --> main.postMap (3 handlers)
[GIN-debug] Loaded HTML Templates (3): 
	- 
	- index.html
	- note.html

[GIN-debug] Listening and serving HTTP on :8080

server.go를 실행하면 ./example/templates/ 하위에 있는 html파일 리스트가 보입니다.

localhost:8080/note 경로를 실행해 봅니다.

first name과 family name에 내용을 넣고 Submit 버튼을 클릭합니다.

map 형태의 데이터가 json 데이터로 출력됩니다.


'Golang > Gin' 카테고리의 다른 글

Grouping routes  (0) 2019.03.04
Upload files  (0) 2019.02.27
Another example: query + post form  (0) 2019.02.15
Multipart/Urlencoded Form  (1) 2019.02.14
Querystring parameters  (0) 2019.02.14
Comments