Adding httprouter dependency to manage endpoints. Adding our routes to routes.go file facilitating endpoints management and adding POST /v1/movies and GET /v1/movies/:id endpoints. Updating main.go file removing ServeMux and add httprouter instead in app structure. Creating movies.go file to manage create and show movie endpoint.

This commit is contained in:
Maxime Delporte
2025-10-10 16:15:30 +02:00
parent 4342a8df0d
commit e0931223e4
6 changed files with 77 additions and 8 deletions

View File

@@ -57,13 +57,6 @@ func main() {
logger: logger,
}
/*
Declare a new servemux and add a /v1/healthcheck route which dispatches requests
to the healthcheckHandler method.
*/
mux := http.NewServeMux()
mux.HandleFunc("/v1/healthcheck", app.healthcheckHandler)
/*
Declare a HTTP server which listens on the port provided in the config struct,
uses the servemux we created above as the handler, has some sensible timeout
@@ -71,7 +64,7 @@ func main() {
*/
srv := &http.Server{
Addr: fmt.Sprintf(":%d", cfg.port),
Handler: mux,
Handler: app.routes(),
IdleTimeout: time.Minute,
ReadTimeout: 5 * time.Second,
WriteTimeout: 10 * time.Second,

40
cmd/api/movies.go Normal file
View File

@@ -0,0 +1,40 @@
package main
import (
"fmt"
"github.com/julienschmidt/httprouter"
"net/http"
"strconv"
)
// "POST /v1/movies" endpoint.
func (app *application) createMovieHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "create a new movie")
}
// "GET /v1/movies/:id"
func (app *application) showMovieHandler(w http.ResponseWriter, r *http.Request) {
/*
When httprouter is parsing a request, any interpolated URL parameters will be
stored in the request context. We can use the ParamsFromContext() function to
retrieve a slice containing these parameter names and values.
*/
params := httprouter.ParamsFromContext(r.Context())
/*
We can then use the ByName() method to get the value of the "id" parameter from
the slice. In our project all movies will have a unique positive integer ID, but
the value returned by ByName() is always a string. So we try to convert it to a
base 1° integer (with a bit size of 64). If the parameter couldn't be converted,
or is less than 1, we know the ID is invalid so we use the http.NotFound()
func to return a 404 Not Found Response.
*/
id, err := strconv.ParseInt(params.ByName("id"), 10, 64)
if err != nil || id < 1 {
http.NotFound(w, r)
return
}
// Otherwise, interpolate the movie ID in a placeholder response.
fmt.Fprintf(w, "show the details of movie %d\n", id)
}

24
cmd/api/routes.go Normal file
View File

@@ -0,0 +1,24 @@
package main
import (
"github.com/julienschmidt/httprouter"
"net/http"
)
func (app *application) routes() http.Handler {
// Initialize a new httprouter router instance
router := httprouter.New()
/*
Register the relevant methods, URL patterns and handler functions for our
endpoints using the HandlerFunc() method. Note that http.MethodGet and
http.MethodPost are constants which equate to the strings "GET" and "POST"
respectively.
*/
router.HandlerFunc(http.MethodGet, "/v1/healthcheck", app.healthcheckHandler)
router.HandlerFunc(http.MethodPost, "/v1/movies", app.createMovieHandler)
router.HandlerFunc(http.MethodGet, "/v1/movies/:id", app.showMovieHandler)
// Return the httprouter instance.
return router
}