Golang GORM и декодирование HTTP.Request.Body в 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
}

1 ответ

Решение

Запрос действителен JSON, поэтому вы не получите ошибку JSON. Если схема допускает нулевое значение для вашей структуры, это также верно, поэтому вы не получите ошибку от gorm. По всем параметрам, которые вы используете, ваш ввод действителен. Если вам нужна дополнительная проверка, вам придется записать ее в свой обработчик.

Другие вопросы по тегам