Martini의 기본 router를 사용하면 key-value형식으로 된 POST 데이터는 아주 쉽게 받을 수 있습니다.


하지만 POST 데이터를 JSON 형식으로 보내게 된다면 martini의 기본 router를 사용해서는 값을 받을 수 없습니다.


이럴 땐 다음과 같이 하여 JSON 형식으로 된 POST 데이터를 활용할 수 있습니다.


package main
 
import (
    "github.com/go-martini/martini"
    "github.com/martini-contrib/render"
    "net/http"
    "io/ioutil"
    "encoding/json"
)


func main() {
  m := martini.Classic()
  m.Use(render.Renderer(render.Options{
    Layout: "layout",
  }))
 
  data := make(map[string]interface{})
  data["hello"] = "안녕"
  data["world"] = "세계"
  data["value"] = 1
 
  m.Get("/", func(r render.Render) {
    r.HTML(200, "hello", data)
  })
 
  m.Get("/api", func(r render.Render) {
    r.JSON(200, data)
  })
 
  m.Post("/api", func(req *http.Request, r render.Render, params martini.Params) {
    if req.Body != nil {
      defer req.Body.Close()
      body, err := ioutil.ReadAll(req.Body)
      if err != nil {
        log.Panic(err)
      }
      var data interface{}
      err = json.Unmarshal(body, &init)
      if err != nil {
        log.Panic(err)
      }

      log.Println(data)
    }
    r.Text(200, "")
  })

  m.Run()
}