将 JSON 作为 POST 请求发送到使用 web.go 框架编写的 Web API。

huangapple go评论82阅读模式
英文:

Sending json in POST request to web api written in web.go framework

问题

我正在使用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)
	}

	//测试JSON解析
	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的任何输出。我该如何解决这个问题?

谢谢。

英文:

Im using web.go (http://webgo.io/) for writing a simple web app that accepts json in a POST request and after parsing it returns the result. Im having trouble reading the json from ctx.Params object.
Below is the code i have so far

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")
}

Though the post request gets registered i dont see anything printed on the command line for the json i posted. How can i fix this ?

Thank You

答案1

得分: 1

你无法从POST请求的正文中获取任何JSON数据的原因是因为hoisie/web将表单数据读入.Params中,可以在这里看到:

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

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

例如,以下代码应该可以工作:

json := make(map[string]interface{})
body, err := ioutil.ReadAll(ctx.Body)
if err != nil {
  // 处理读取正文错误
  return
}
err = json.Unmarshal(body, &json)
if err != nil {
  // 处理JSON解析错误
  return
}
// 使用 `json`
英文:

The reason you're not getting any JSON data from the body of the POST request is because hoisie/web reads form data into .Params, as seen here:

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

In order to fix this, you'll need to add something that can parse the raw body of the response. You should just be able to use ctx.Body to access the raw body, since it implements *http.Request and doesn't redefine Body in the Context struct.

For example, this should work:

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`

huangapple
  • 本文由 发表于 2014年1月9日 15:27:43
  • 转载请务必保留本文链接:https://go.coder-hub.com/21014073.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定