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

向web.go框架中编写的web api发送POST请求中的json,go,Go,Im使用web.go()编写一个简单的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.Par

Im使用web.go()编写一个简单的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")
}
虽然post请求已注册,但我在命令行中没有看到我发布的json的任何内容。我怎样才能解决这个问题


谢谢

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

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

例如,这应该起作用:

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`

您应该使用
fmt.Printf
打印上下文的值(
println
是一个特殊的内置函数)。至于打印JSON:返回
string(mapD)
不会将其打印到命令行。它将把它写入HTTP响应。您应该在浏览器中访问
0.0.0.0:9999/
decoder:=json.NewDecoder(ctx.Request.Body);
mp:=make(map[string]string);
decoder.Decode(mp)
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`