Golang GORM和将HTTP.Request.Body解码为JSON。

huangapple go评论82阅读模式
英文:

Golang GORM and Decoding HTTP.Request.Body into JSON

问题

我正在尝试将一个使用gorilla/mux处理的JSON请求解码为一个结构体,并使用GORM将其保存到MySQL数据库中。我使用curl发送请求(请参见cURL命令)。该请求无效,应该在两个地方失败:1)它不应该解码为结构体;2)它不应该保存到数据库中。我不确定我做错了什么,希望能得到帮助 Golang GORM和将HTTP.Request.Body解码为JSON。

解码后的结构体如下所示:

{{0 0001-01-01 00:00:00 +0000 UTC 0001-01-01 00:00:00 +0000 UTC } }

cURL命令:

curl -d '{"key1":"value1", "key2":"value2"}' -H "Content-Type: application/json" -X POST http://localhost:8080/api/dimoengra/subscribe

代码:

package subscribe

import "github.com/jinzhu/gorm"
import "net/http"
import "encoding/json"
import "fmt"

// Subscription ...
type Subscription struct {
gorm.Model
ServiceID string gorm:"not null" json:"ServiceID"
MessageCode string gorm:"not null" json:"MessageCode"
SubscriberCallbackURL string gorm:"not null" json:"SubscriberCallbackURL"
}

// SubscribeHandler ...
func SubscribeHandler(w http.ResponseWriter, r *http.Request, db *gorm.DB) {

fmt.Println("Handle Subscribtion")

if r.Body == nil {
http.Error(w, "Please send a request body", 400)
fmt.Println("Empty body")
return
}

var s Subscription
err := json.NewDecoder(r.Body).Decode(&s)
if err != nil {
fmt.Println("Error:", err)
http.Error(w, err.Error(), 400)
return
}
fmt.Println(s)

err = Subscribe(db, s)
if err != nil {
fmt.Println("Error:", err)
http.Error(w, err.Error(), 400)
return
}

}

// Subscribe ...
func Subscribe(db *gorm.DB, subscription Subscription) error {

err := db.Create(&subscription)
fmt.Println("err:", err.Error)
return err.Error
}

英文:

I am trying to decode a json request (handled with gorilla/mux) into a struct and save it with GORM into a mysql database. I send the request with curl (see the cURL command). The request is invalid and should fail at 2 points 1) It should not decode into the struct 2) It should not be saved to the database. I am not sure what I am doing wrong and would appreciate help Golang GORM和将HTTP.Request.Body解码为JSON。

The decoded struct looks like this:

{{0 0001-01-01 00:00:00 +0000 UTC 0001-01-01 00:00:00 +0000 UTC <nil>}   }

cURL command:

curl -d '{"key1":"value1", "key2":"value2"}' -H "Content-Type: application/json" -X POST http://localhost:8080/api/dimoengra/subscribe

Code:

package subscribe

import "github.com/jinzhu/gorm"
import "net/http"
import "encoding/json"
import "fmt"

// Subscription ...
type Subscription struct {
  gorm.Model
  ServiceID             string `gorm:"not null" json:"ServiceID"`
  MessageCode           string `gorm:"not null" json:"MessageCode"`
  SubscriberCallbackURL string `gorm:"not null" json:"SubscriberCallbackURL"`
}

// SubscribeHandler ...
func SubscribeHandler(w http.ResponseWriter, r *http.Request, db *gorm.DB) {

fmt.Println("Handle Subscribtion")

if r.Body == nil {
	http.Error(w, "Please send a request body", 400)
	fmt.Println("Empty body")
	return
}

var s Subscription
err := json.NewDecoder(r.Body).Decode(&s)
if err != nil {
	fmt.Println("Error:", err)
	http.Error(w, err.Error(), 400)
	return
}
fmt.Println(s)

err = Subscribe(db, s)
if err != nil {
	fmt.Println("Error:", err)
	http.Error(w, err.Error(), 400)
	return
}

}

// Subscribe ...
func Subscribe(db *gorm.DB, subscription Subscription) error {

err := db.Create(&subscription)
fmt.Println("err:", err.Error)
return err.Error
}

答案1

得分: 0

请求是有效的 JSON,因此您不会收到 JSON 错误。如果您的结构体的零值是允许的,那也是有效的,所以您不会从 gorm 收到错误。根据您使用的所有措施,您的输入是有效的。如果您想要额外的验证,您需要将其编写到您的处理程序中。

英文:

The request is valid JSON, so you won't get a JSON error. If the zero value for your struct is allowed by the schema, that's also valid, so you won't get an error from gorm. By all measures you're using, your input is valid. If you want additional validation, you'll have to write it into your handler.

huangapple
  • 本文由 发表于 2017年6月15日 02:48:17
  • 转载请务必保留本文链接:https://go.coder-hub.com/44552481.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定