diff --git a/cmd/api/movies.go b/cmd/api/movies.go index c9a33ab..55fa179 100644 --- a/cmd/api/movies.go +++ b/cmd/api/movies.go @@ -1,6 +1,7 @@ package main import ( + "encoding/json" "fmt" "greenlight.craftr.fr/internal/data" "net/http" @@ -9,7 +10,23 @@ import ( // "POST /v1/movies" endpoint. func (app *application) createMovieHandler(w http.ResponseWriter, r *http.Request) { - fmt.Fprintln(w, "create a new movie") + // Declare an anonymous struct to hold the information that we expect to be in the HTTP request body (note that the field names and types in the struct are a subset of the Movie struct that we created earlier). This struct will be our *target decode destination*. + var input struct { + Title string `json:"title"` + Year int32 `json:"year"` + Runtime int32 `json:"runtime"` + Genres []string `json:"genres"` + } + + // Initialize a new json.Decoder instance which reads from the request body, and then use the Decode() method to decode the body contents into the input struct. Importantly, notice that when we call Decode() we pass a *pointer* to the input struct as the target decode destination. If there was an error during decoding, we also use our generic errorResponse() helper to send the client a 400 Bad Request response containing the error message. + err := json.NewDecoder(r.Body).Decode(&input) + if err != nil { + app.errorResponse(w, r, http.StatusBadRequest, err.Error()) + return + } + + // Dump the contents of the input struct in a HTTP response. + fmt.Fprintf(w, "%+v\n", input) } // "GET /v1/movies/:id"