1. ホーム

[解決済み】GoでJSONのPost Requestを処理する

2022-03-29 15:41:37

質問

というわけで、信じられないほどハチャメチャに思える以下のようなものがあり、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とも呼ばれ、他の人が見つけられるようにここに書いてあります)

解決するには?

を使用してください。 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)
}