所以我有了下面的代码,看起来非常的老套,我一直在想Go语言有比这个设计得更好的库,但是我找不到Go语言处理JSON数据POST请求的例子,它们都是表单POST。
下面是一个请求示例:curl -X POST -d "{\"test\": \"that\"}" http://localhost:8082/test
下面是嵌入了日志的代码:
package main
import (
"encoding/json"
"log"
"net/http"
)
type test_struct struct {
Test string
}
func test(rw http.ResponseWriter, req *http.Request) {
req.ParseForm()
log.Println(req.Form)
//LOG: map[{"test": "that"}:[]]
var t test_struct
for key, _ := range req.Form {
log.Println(key)
//LOG: {"test": "that"}
err := json.Unmarshal([]byte(key), &t)
if err != nil {
log.Println(err.Error())
}
}
log.Println(t.Test)
//LOG: that
}
func main() {
http.HandleFunc("/test", test)
log.Fatal(http.ListenAndServe(":8082", nil))
}
一定有更好的方法,对吧?我只是在寻找最佳实践时被难住了。
(Go在搜索引擎中也被称为Golang,在这里提到它是为了让其他人能够找到它。)
8条答案
按热度按时间rks48beu1#
请使用
json.Decoder
代替json.Unmarshal
。2w3rbyxf2#
您需要从
req.Body
读取。ParseForm
方法从req.Body
阅读,然后以标准HTTP编码格式解析它。您需要的是读取主体并以JSON格式解析它。这是你的更新代码。
mzaanser3#
json.Decoder
优于json.Unmarshal
的原因有两个--2013年最流行的答案中没有提到这两个原因:go 1.10
引入了一种新方法json.Decoder.DisallowUnknownFields(),该方法解决了检测不需要的JSON输入的问题req.Body
已经是一个io.Reader
。如果流是(比如说10 MB的无效JSON块),则阅读其全部内容然后执行json.Unmarshal
会浪费资源。如果遇到无效JSON,则在请求主体 * 流入 * 时使用json.Decoder
解析请求主体将触发早期解析错误。实时处理I/O流是首选的 * 方式 *。解决一些关于检测错误用户输入的用户评论:
要强制执行必填字段和其他卫生检查,请尝试:
Playground
典型输出:
polhcujo4#
这个问题让我快把自己逼疯了,我的JSON编组器和解组器没有填充Go结构体,然后我在https://eager.io/blog/go-and-json找到了解决方案:
与Go语言中的所有结构体一样,需要记住的是,只有首字母大写的字段才能被外部程序(如JSON Marshaller)看到。
从那以后,我的编组器和解组器工作得非常完美!
hsvhsicv5#
我发现下面的例子从文档真的很有帮助(源代码在这里)。
这里的关键是操作员想要解码
...在这种情况下,我们将删除
const jsonStream
,并将Message
结构体替换为test_struct
:更新:我还要补充一点,this post也提供了一些关于使用JSON响应的很棒的数据。作者解释了
struct tags
,这是我不知道的。由于JSON通常看起来不像
{"Test": "test", "SomeKey": "SomeVal"}
,而是{"test": "test", "somekey": "some value"}
,因此可以如下所示重新构造结构体:......现在处理程序将使用“some-key”而不是“SomeKey”(您将在内部使用)解析JSON。
velaa5lx6#
我喜欢在本地定义自定义结构体。
nhaq1z217#
zazmityj8#
早期的ReadAll函数是ioutil包的一部分,但是现在它被弃用了,但是现在io包本身有了ReadAll函数。