当前位置: 首页 > 知识库问答 >
问题:

在Go中处理JSON Post请求

舒博雅
2023-03-14

因此,我有以下内容,这似乎令人难以置信的骇客,我一直在想,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,这里提到了它,这样其他人就可以找到它。)

共有3个答案

牧甫
2023-03-14

为什么json. Decoder应该比json. Unmarshal更受欢迎,这两个原因在2013年最流行的答案中没有提到:

  1. 2018年2月,go 1.10引入了一种新的方法json. Decoder. DislowUnknown nFields(),解决了检测不需要的JSON输入的问题
  2. 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
申屠健
2023-03-14

您需要从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))
}
文嘉禧
2023-03-14

请使用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的好处在于,它在提供列表和映射语义时(它可能变得非常方便),解析起来相当容易并且易于人类阅读/编辑(这对于许多