title: Golang GORM and Decoding HTTP.Request.Body into JSON
body: <p>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 :) </p>
  
  <p>The decoded struct looks like this:</p>
  
  <pre><code>{{0 0001-01-01 00:00:00 +0000 UTC 0001-01-01 00:00:00 +0000 UTC &lt;nil&gt;}   }
  </code></pre>
  
  <p>cURL command:</p>
  
  <pre><code>curl -d '{"key1":"value1", "key2":"value2"}' -H "Content-Type: application/json" -X POST http://localhost:8080/api/dimoengra/subscribe
  </code></pre>
  
  <p>Code:</p>
  
  <pre><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(&amp;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(&amp;subscription)
  fmt.Println("err:", err.Error)
  return err.Error
  }
  </code></pre>