因此,我有以下内容,这似乎令人难以置信的骇客,我一直在想,Go有比这更好的设计库,但我找不到Go处理JSON数据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,这里提到了它,这样其他人就可以找到它。)
为什么json. Decoder
应该比json. Unmarshal
更受欢迎,这两个原因在2013年最流行的答案中没有提到:
go 1.10
引入了一种新的方法json. Decoder. DislowUnknown nFields(),解决了检测不需要的JSON输入的问题req. body
已经是一个io. Reader
。读取其全部内容,然后执行json。如果流是10MB的无效JSON块,则Unmarshal
会浪费资源。如果遇到无效JSON,则使用json. Decoder
解析请求体会触发早期解析错误。实时处理I/O流是首选方法。解决一些关于检测错误用户输入的用户评论:
要强制执行必填字段和其他卫生检查,请尝试:
d := json.NewDecoder(req.Body)
d.DisallowUnknownFields() // catch unwanted fields
// anonymous struct type: handy for one-time use
t := struct {
Test *string `json:"test"` // pointer so we can test for field absence
}{}
err := d.Decode(&t)
if err != nil {
// bad JSON or unrecognized json field
http.Error(rw, err.Error(), http.StatusBadRequest)
return
}
if t.Test == nil {
http.Error(rw, "missing field 'test' from JSON object", http.StatusBadRequest)
return
}
// optional extra check
if d.More() {
http.Error(rw, "extraneous data after JSON object", http.StatusBadRequest)
return
}
// got the input we expected: no more, no less
log.Println(*t.Test)
游戏场
典型输出:
$ curl -X POST -d "{}" http://localhost:8082/strict_test
expected json field 'test'
$ curl -X POST -d "{\"Test\":\"maybe?\",\"Unwanted\":\"1\"}" http://localhost:8082/strict_test
json: unknown field "Unwanted"
$ curl -X POST -d "{\"Test\":\"oops\"}g4rB4g3@#$%^&*" http://localhost:8082/strict_test
extraneous data after JSON
$ curl -X POST -d "{\"Test\":\"Works\"}" http://localhost:8082/strict_test
log: 2019/03/07 16:03:13 Works
您需要从req. body
中读取。ParseForm
方法是从req. body
中读取,然后以标准的HTTP编码格式解析它。您想要的是读取正文并以JSON格式解析它。
这是你的代码更新。
package main
import (
"encoding/json"
"log"
"net/http"
"io/ioutil"
)
type test_struct struct {
Test string
}
func test(rw http.ResponseWriter, req *http.Request) {
body, err := ioutil.ReadAll(req.Body)
if err != nil {
panic(err)
}
log.Println(string(body))
var t test_struct
err = json.Unmarshal(body, &t)
if err != nil {
panic(err)
}
log.Println(t.Test)
}
func main() {
http.HandleFunc("/test", test)
log.Fatal(http.ListenAndServe(":8082", nil))
}
请使用json. Decoder
代替json. Unmarshal
。
func test(rw http.ResponseWriter, req *http.Request) {
decoder := json.NewDecoder(req.Body)
var t test_struct
err := decoder.Decode(&t)
if err != nil {
panic(err)
}
log.Println(t.Test)
}
问题内容: 因此,我得到了以下内容,这些内容似乎难以置信,我一直在想自己Go的库设计得比此更好,但是我找不到Go处理JSON数据POST请求的示例。它们都是POST形式。 这是一个示例请求: 这是代码,其中嵌入了日志: 必须有更好的方法,对吗?我只是为寻找最佳实践而感到困惑。 (Go在搜索引擎中也被称为Golang,在这里提到它,以便其他人可以找到它。) 问题答案: 请使用代替。
频率控制是控制资源利用和保证服务高质量的重要机制。Go可以使用goroutine,channel和ticker来以优雅的方式支持频率控制。 package main import "time" import "fmt" func main() { // 首先我们看下基本的频率限制。假设我们得控制请求频率, // 我们使用一个通道来处理所有的这些请求,这里向requests
问题内容: 我在网上搜索,但没有找到与i18n和Go相关的任何内容。 我希望使用Go来开发网站。处理国际化的最佳方法是什么? 问题答案: go-i18n具有一些不错的功能: 实施CLDR复数规则。 对带变量的字符串使用文本/模板。 翻译文件是简单的JSON。
问题内容: 进行Ajax调用时,将contentType设置为application / json而不是默认的x-www-form- urlencoded时,服务器端(在PHP中)无法获取post参数。 在以下工作示例中,如果我在ajax请求中将contentType设置为“ application / json”,则PHP $ _POST将为空。为什么会这样?我如何在PHP中正确处理conten
我有一个程序,用来在点击按钮后从网页上刮取源代码。我无法抓取正确的页面,因为我相信正在发送一个AJAX请求,我不会等待响应的发生。我的代码当前为: 参考此链接后,我相信要解决此问题,我可以实现“webClient.waitForBackgroundJavaScript(10000)”方法。唯一的问题是我不知道如何做到这一点,因为每次单击按钮时,我都会创建一个HtmlPage对象,而不是WebCli
问题内容: 我是Go编程的新手,我想知道:处理Go程序的配置参数的首选方法是什么(在其他情况下,可能会使用 属性 文件或 ini 文件的东西)? 问题答案: 该JSON格式为我工作得很好。标准库提供了编写缩进数据结构的方法,因此可读性很强。 另请参阅此golang-nuts线程。 JSON的好处在于,它在提供列表和映射语义时(它可能变得非常方便),解析起来相当容易并且易于人类阅读/编辑(这对于许多