英文:
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`
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论