将POST请求中的json发送到web.go框架中编写的web api

时间:2014-01-09 07:27:43

标签: go

我使用web.go(http://webgo.io/)编写一个简单的Web应用程序,在POST请求中接受json,在解析后返回结果。我无法从ctx.Params对象中读取json。 以下是我到目前为止的代码

package main

import  (
    "github.com/hoisie/web";
     "encoding/json"
)

func parse(ctx *web.Context, val string) string { 

    for k,v := range ctx.Params {
        println(k, v)       
    }

   //Testing json parsing
   mapB := map[string]int{"apple": 5, "lettuce": 7}
   mapD, _ := json.Marshal(mapB)
   return string(mapD)

}   

func main() {
    web.Post("/(.*)", parse)
    web.Run("0.0.0.0:9999")
}

虽然帖子请求已经注册,但我没有看到在我发布的json的命令行上打印的任何内容。我该如何解决这个问题?

谢谢

1 个答案:

答案 0 :(得分:1)

您没有从POST请求正文中获取任何JSON数据的原因是因为hoisie/web将表单数据读入.Params,如here所示:

req.ParseForm()
if len(req.Form) > 0 {
    for k, v := range req.Form {
        ctx.Params[k] = v[0]
    }
}

为了解决这个问题,你需要添加一些可以解析响应原始主体的东西。您应该能够使用ctx.Body来访问原始正文,因为它实现了*http.Request并且未在Body结构中重新定义Context

例如,这应该有效:

json := make(map[string]interface{})
body, err := ioutil.ReadAll(ctx.Body)
if err != nil {
  // Handle Body read error
  return
}
err = json.Unmarshal(body, &json)
if err != nil {
  // Handle JSON parsing error
  return
}
// Use `json`