Golang GORM 和解码 HTTP.Request.Body 成 JSON
Golang GORM and Decoding HTTP.Request.Body into JSON
我正在尝试将 json 请求(使用 gorilla/mux 处理)解码为一个结构,并使用 GORM 将其保存到 mysql 数据库中。我使用 curl 发送请求(请参阅 cURL 命令)。请求无效,应该在 2 点失败 1) 它不应该解码到结构中 2) 它不应该保存到数据库中。我不确定我做错了什么,希望得到帮助:)
解码后的结构如下所示:
{{0 0001-01-01 00:00:00 +0000 UTC 0001-01-01 00:00:00 +0000 UTC <nil>} }
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
}
请求有效 JSON,因此您不会收到 JSON 错误。如果架构允许您的结构的零值,那也是有效的,因此您不会从 gorm 收到错误。通过您使用的所有措施,您的输入是有效的。如果你想要额外的验证,你必须将它写入你的处理程序。
我正在尝试将 json 请求(使用 gorilla/mux 处理)解码为一个结构,并使用 GORM 将其保存到 mysql 数据库中。我使用 curl 发送请求(请参阅 cURL 命令)。请求无效,应该在 2 点失败 1) 它不应该解码到结构中 2) 它不应该保存到数据库中。我不确定我做错了什么,希望得到帮助:)
解码后的结构如下所示:
{{0 0001-01-01 00:00:00 +0000 UTC 0001-01-01 00:00:00 +0000 UTC <nil>} }
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
}
请求有效 JSON,因此您不会收到 JSON 错误。如果架构允许您的结构的零值,那也是有效的,因此您不会从 gorm 收到错误。通过您使用的所有措施,您的输入是有效的。如果你想要额外的验证,你必须将它写入你的处理程序。