我有码头集装箱。有一个服务器(在 Go 上)处理 8000 端口上的发布请求。该代码:package mainimport ( "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:80Hello WORLDInserting has been succesfully但是得到的数据是错误的(nil,nil,nil,0):go run /home/go/hello.go 0
1 回答
MMMHUHU
TA贡献1834条经验 获得超8个赞
您的代码的主要问题是当您尝试解码服务器在响应中提供的 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 的替代方法)。
- 1 回答
- 0 关注
- 87 浏览
添加回答
举报
0/150
提交
取消