don't stop believing

Multipart/Urlencoded Form 본문

Golang/Gin

Multipart/Urlencoded Form

Tongchun 2019. 2. 14. 23:42

html의 form tag로 데이터를 보내고 확인해 보겠습니다.

https://github.com/gin-gonic/gin#multiparturlencoded-form


먼저 아래와같이 html 페이지가 있다가 가정해 보겠습니다.

<html>
    <head>
        <title>Tongchun's go gin</title>
    </head>
    <body>
        <form action="http://localhost:8080/form_post" method="POST">
            message: <input type="text" name="message">
            nick: <input type="text" name="nick">
            <input type="submit" value="Submit">
        </form>
    </body>
</html>

form tag의 action은 데이터를 넘기는 url입니다. method는 post로 넘어갑니다.

넘기는 데이터로는 message와 nick이 있습니다.

실행하면 아래와 같은 화면입니다.

이제 go 코드 입니다.

package main

import (
	"github.com/gin-gonic/gin"
)

func setupRouter() *gin.Engine {
	// Disable Console Color
	// gin.DisableConsoleColor()
	r := gin.Default()

	r.POST("/form_post", formPost)

	return r
}

func formPost(c *gin.Context) {
	message := c.PostForm("message")
	nick := c.DefaultPostForm("nick", "anonymous")

	headerType := c.GetHeader("Content-Type")

	c.JSON(200, gin.H{
		"status":              "posted",
		"message":             message,
		"nick":                nick,
		"header-content-type": headerType,
	})
}

func main() {
	r := setupRouter()
	// Listen and Server in 0.0.0.0:8080
	r.Run(":8080")
}

라우터 설정은 POST method로 경로는 /form_post 입니다. formPost 핸들러 함수가 실행됩니다.

r.POST("/form_post", formPost)


formPost() 함수는 아래와 같습니다.

func formPost(c *gin.Context) {

message := c.PostForm("message")

nick := c.DefaultPostForm("nick", "anonymous")


headerType := c.GetHeader("Content-Type")


c.JSON(200, gin.H{

"status":              "posted",

"message":             message,

"nick":                nick,

"header-content-type": headerType,

})

}

PostForm() 함수와 DefaultPostForm() 함수로 form tag로 넘어온 데이터를 받을 수 있습니다.

그리고 넘어온 request의 header 데이터 중 Content-Type을 확인하기 위해 하나 넣었습니다.

그리고 넘어온 데이터를 json 형태로 response 합니다.


이제 실행하고 form tag를 이용해 데이터를 넘겨 보겠습니다.

$ go run 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] POST   /form_post                --> main.formPost (3 handlers)
[GIN-debug] Listening and serving HTTP on :8080

다시 html 페이지를 열고 message에 hello!, nick에는 tongchun을 넣어 보겠습니다.

submit을 클릭해 response되는 json 데이터를 확인해 보겠습니다.

{"header-content-type":"application/x-www-form-urlencoded","message":"hello!","nick":"tongchun","status":"posted"}

form tag로 넘긴 데이터가 잘 전달됩니다. 

header의 Content-Type은 application/x-www-form-urlencoded로 확인됩니다.


이번에는 form에 아무런 데이터도 없이 전달하겠습니다.

message와 nick 모두 빈 공백으로 전달되네요. 그럼 DefaultPostForm() 함수의 "anonymous"값은 언제 넘어 오는 걸까요?

html 페이지의 form tag 중 nick에 해당하는 input을 제거해 봤습니다.

message에는 hello! 를 입력하고 submit을 클릭합니다.

nick에 "anonymous"가 보입니다. DefaultPostform() 함수의 default 값은 전달되는 값이 빈 공백이 아닌 parameter 자체가 없을 경우 default 설정값이 전달되게 됩니다.


만약 postman과 같은 도구로 확인해야 할 경우 아래와 같이 작성하면 됩니다.

여기까지 form tag를 이용한 전달 받법이었습니다.


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

Map as querystring or postform parameters  (0) 2019.02.27
Another example: query + post form  (0) 2019.02.15
Querystring parameters  (0) 2019.02.14
Parameters in path  (0) 2019.02.13
Using GET, POST, PUT, PATCH, DELETE and OPTIONS  (0) 2019.02.13
Comments