英文:
Golang GORM and Decoding HTTP.Request.Body into JSON
问题
我正在尝试将一个使用gorilla/mux处理的JSON请求解码为一个结构体,并使用GORM将其保存到MySQL数据库中。我使用curl发送请求(请参见cURL命令)。该请求无效,应该在两个地方失败:1)它不应该解码为结构体;2)它不应该保存到数据库中。我不确定我做错了什么,希望能得到帮助
解码后的结构体如下所示:
{{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
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.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论