猿问

如何正确处理通过curl通过docker传递的go中的json数据

我有码头集装箱。有一个服务器(在 Go 上)处理 8000 端口上的发布请求。该代码:


package main


import (

    "database/sql"

    _ "github.com/lib/pq"

    "fmt"

    "net/http"

    "encoding/json"

)


type tv_type struct { 

    brand string `json:"brand"`

    manufacturer string `json:"manufacturer"`

    model string `json:"model"`

    year int16 `json:"year"`


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

        if r.Method == http.MethodGet {

           //blahblah

        }

    fmt.Fprintln(w, "Hello WORLD")

       if r.Method == http.MethodPost {

        connStr := "user=www password=qwerty dbname=products sslmode=disable"

        db, err := sql.Open("postgres", connStr)

        defer db.Close()

        if err != nil {

            panic(err)

        } 

        decoder := json.NewDecoder(r.Body)

        var t tv_type

        err = decoder.Decode(&t)


        if err != nil {

            panic(err)

        }

        _, err = db.Exec("insert into TV (brand, manufacturer, model, year) values ($1, $2, $3, $4)",

            t.brand, t.manufacturer, t.model, t.year)

        if err != nil {

            panic(err)

        } else {

                        fmt.Println(t.brand, t.manufacturer, t.model, t.year)

            fmt.Fprintln(w, "Inserting has been succesfully")

        }

    }

}


func main() {

    http.HandleFunc("/", handler)

    http.ListenAndServe(":8000", nil)

}

运行 Docker 容器,在 8000 端口的 docker 容器上请求 80 自己的端口代理。


运行这个之后:


curl -X POST -H "Content-Type:application/json" -d '{"brand":"samsung", "manufacturer":"samsung", "model":"x1", "year":2015 }' http://localhost:80

Hello WORLD

Inserting has been succesfully

但是得到的数据是错误的(nil,nil,nil,0):


go run /home/go/hello.go 

   0


慕码人8056858
浏览 88回答 1
1回答

MMMHUHU

您的代码的主要问题是当您尝试解码服务器在响应中提供的 json 时,您的结构无法解组数据。由于结构字段未导出。将结构字段更改为大写,如下所示:type Tv_type struct {      Brand string `json:"brand"`     Manufacturer string `json:"manufacturer"`     Model string `json:"model"`     Year int16 `json:"year"`}检查Playground 示例以获取工作代码。在 Golang 规范中也提到了Unmarshal为:为了将 JSON 解组为结构,Unmarshal 将传入的对象键与 Marshal 使用的键(结构字段名称或其标记)进行匹配,首选完全匹配但也接受不区分大小写的匹配。默认情况下,没有相应结构字段的对象键将被忽略(参见 Decoder.DisallowUnknownFields 的替代方法)。
随时随地看视频慕课网APP

相关分类

Go
我要回答