When to use this skill
Use this skill when the user needs to:
- Define HTTP endpoints: Create new routes for various HTTP methods (e.g.,
mux.Get("/users/:id", getUserHandler)) including dynamic path segments (/users/{id}) and wildcards (/files/*filePath). - Implement request preprocessing/postprocessing: Add global middlewares (e.g., for authentication, logging, CORS) or group-specific middlewares to handle requests before they reach the main handler or after they are processed. For example,
mux.Use(authMiddleware)orapiGroup.Use(loggingMiddleware). - Extract incoming data from requests:
- URL Parameters: Retrieve values from dynamic path segments (e.g.,
req.Params("id")). - Query Parameters: Access query string values (e.g.,
req.Query("name", "Guest")). - Form Data: Parse
application/x-www-form-urlencodedormultipart/form-data(e.g.,req.FormValue("username"),req.FormFile("image")). - JSON Payloads: Decode
application/jsonrequest bodies into Go structs (e.g.,req.JSON(&user)).
- URL Parameters: Retrieve values from dynamic path segments (e.g.,
- Construct and send various response types:
- JSON Responses: Send structured data as JSON (e.g.,
ngamux.Res(rw).Status(http.StatusOK).Json(data)). - Text Responses: Send plain text (e.g.,
ngamux.Res(rw).Status(http.StatusOK).Text("Hello, World!")). - HTML Responses: Render HTML templates (e.g.,
ngamux.Res(rw).Status(http.StatusOK).HTML("template.html", data)). - Custom Status Codes: Set specific HTTP status codes for responses.
- JSON Responses: Send structured data as JSON (e.g.,
- Configure router behavior: Adjust global settings like automatically removing trailing slashes (
ngamux.WithTrailingSlash()), setting the logging verbosity (ngamux.WithLogLevel(slog.LevelDebug)), or providing customjson.Marshal/json.Unmarshalfunctions for specific serialization needs. - Organize routes with grouping: Create nested route groups to apply common path prefixes and middlewares to a set of routes (e.g.,
/api/v1). - Debug routing or handler issues: Inspect route definitions, middleware chains, request context, and logging output to diagnose and resolve problems.
Key Functionality
- Route Definition:
ngamuxprovides methods likemux.Get(),mux.Post(),mux.Put(),mux.Delete(),mux.Patch(),mux.Head(), andmux.All()to registerhttp.HandlerFuncs for specific HTTP methods and paths. It supports path parameters (e.g.,/{id}) and wildcards (/*filePath). Routes are efficiently stored and matched using a tree-like structure, leveraging themappingpackage for optimized key-value storage. - Middleware Application: The
mux.Use()method allows global middleware registration, whilemux.Group()andmux.With()enable group-specific middlewares. Middlewares areMiddlewareFunctypes that wraphttp.HandlerFuncs, allowing for a chain of responsibility pattern. TheWithMiddlewaresutility fromcommon.gohandles the functional chaining. - Request Handling: The
Requeststruct (wrapped*http.Request) offers convenience methods:Req().Params(key string): Retrieves URL path parameters parsed during routing.Req().Query(key string, fallback ...string): Accesses URL query string parameters.Req().QueriesParser(data any): Automatically binds query parameters to a Go struct usingquerytags and reflection.Req().FormValue(key string): Gets form field values.Req().FormFile(key string, maxFileSize ...int64): Handles file uploads from multipart forms.Req().JSON(store any): Decodes JSON request bodies into a provided Go interface.Req().Locals(key any, value ...any): Manages request-scoped data in the context.
- Response Handling: The
Responsestruct (wrappedhttp.ResponseWriter) provides a fluent API for crafting responses:Res(rw).Status(code int): Sets the HTTP status code.Res(rw).Text(data string): Sendstext/plaincontent.Res(rw).JSON(data any): Sendsapplication/jsoncontent, using the configured JSON marshaller.Res(rw).HTML(path string, data any): Renders HTML templates usinghtml/template.
- Configuration: Global
Configoptions are set viangamux.New()and functional options likengamux.WithTrailingSlash()andngamux.WithLogLevel(). Custom JSON marshalling/unmarshalling can be provided. - Route Grouping: The
mux.Group(path string)andmux.GroupFunc(path string, router func(mux *Ngamux))methods allow hierarchical organization of routes, where child groups inherit path prefixes and can apply their own set of middlewares, leading to cleaner code organization and shared logic.