所以我有以下,这似乎令人难以置信的hack,我一直在想,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))
}

肯定有更好的办法,对吧?我只是不知道最好的做法是什么。

(围棋在搜索引擎中也被称为Golang,这里提到它是为了让其他人可以找到它。)


当前回答

你需要从req.Body中读取。ParseForm方法正在从请求中读取数据。主体,然后以标准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))
}

其他回答

你需要从req.Body中读取。ParseForm方法正在从请求中读取数据。主体,然后以标准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。解码器而不是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)
}

我喜欢在本地定义自定义结构。所以:

// my handler func
func addImage(w http.ResponseWriter, r *http.Request) {

    // define custom type
    type Input struct {
        Url        string  `json:"url"`
        Name       string  `json:"name"`
        Priority   int8    `json:"priority"`
    }

    // define a var 
    var input Input

    // decode input or return error
    err := json.NewDecoder(r.Body).Decode(&input)
    if err != nil {
        w.WriteHeader(400)
        fmt.Fprintf(w, "Decode error! please check your JSON formating.")
        return
    }

    // print user inputs
    fmt.Fprintf(w, "Inputed name: %s", input.Name)

}
type test struct {
    Test string `json:"test"`
}

func test(w http.ResponseWriter, req *http.Request) {
    var t test_struct

    body, _ := ioutil.ReadAll(req.Body)
    json.Unmarshal(body, &t)

    fmt.Println(t)
}

这个问题快把我逼疯了。我的JSON编组器和解组器没有填充我的Go结构。然后我在https://eager.io/blog/go-and-json:上找到了解决方案

与Go中的所有结构体一样,重要的是只记住这一点 首字母大写的字段对外部程序可见 比如JSON编组器。”

在那之后,我的Marshaller和Unmarshaller工作得很完美!