Please make sure you have Go version 1.15 or higher
mkdir <project-name> && cd <project-name>
go mod init github.com/<user-name>/<repo-name>
go get github.com/gominima/minima
go run main.go
package main
import "github.com/gominima/minima"
func main() {
app := minima.New()
app.Get("/", func(res *minima.Response, req *minima.Request) {
res.Send(200, "Hello World")
})
app.Listen(":3000")
}
Minima's name is inspired by the word minimal and is the motivation for building this framework. As a Golang developer, I was struggling to learn it in my early days due to the steeper learning curve while using net/http.
Also during checking out some other alternative frameworks, I found out that something like fiber wasn't compatible to net/http modules like gqlgen and other middlewares.
Minima solves this problem as it has a very narrow learning curve as well as a robust structure that supports all net/http modules and other middleware without compromising on performance.
func UserGetRouter() *minima.Router {
//router instance which would be used by the main router
router := minima.NewRouter()
return router.Get("/user/:id/?", func(response *minima.Response, request *minima.Request) {
//getting id param from route
id := request.GetParam("id")
//as query params are not part of the request path u need to add a ? to initialize them
username := request.GetQuery("name")
//get user from db
userdata, err := db.FindUser(id, username)
if err != nil {
panic(err)
//check for errors
response.Status(404).Send("No user found with particular id")
}
//sending user
response.Json(userdata).Status(200)
})
}
func main() {
//main minima instance
app := minima.New()
//UseRouter method takes minima.router as param
//It appends all the routes used in that specific router to the main instance
app.UseRouter(UserGetRouter())
//running the app
app.Listen(":3000")
}
func main() {
app := minima.New()
app.Get("/getuser/:id", func(response *minima.Response, request *minima.Request) {
userid := request.GetParam("id")
// check if user id is available
if userid == "" {
response.Error(404, "No user found")
panic("No user id found in request")
}
fmt.Print(userid)
//Will print 20048 from router /getuser/200048
})
}
func main() {
app := minima.New()
app.Get("/getuser/?", func(response *minima.Response, request *minima.Request) {
//query params work a bit different instead of adding a param in route ur u just need to add a ? and fetch the param
userid := request.GetQuery("id")
if userid == "" {
response.Error(404, "No user found")
panic("No user id found in request")
}
fmt.Print(userid)
//Will print 20048 from router /getuser?id=20048
})
}
type Minima interface {
//Minima interface is built over net/http so every middleware is compatible with it
//initializes net/http server with address
Listen(address string) error
//handler interface
ServeHTTP(w http.ResponseWriter, q *http.Request)
//Router methods
Get(path string, handler ...Handler) *minima
Patch(path string, handler ...Handler) *minima
Post(path string, handler ...Handler) *minima
Put(path string, handler ...Handler) *minima
Options(path string, handler ...Handler) *minima
Head(path string, handler ...Handler) *minima
Delete(path string, handler ...Handler) *minima
//Takes middlewares as a param and adds them to routes
//middlewares initializes before route handler is mounted
Use(handler Handler) *minima
//Mounts routes to specific base path
Mount(basePath string, router *Router) *minima
//Takes minima.Router as param and adds the routes from router to main instance
UseRouter(router *Router) *minima
//Works as a config for minima, you can add multiple middlewares and routers at once
UseConfig(config *Config) *minima
//Shutdowns the net/http server
Shutdown(ctx context.Context) error
//Prop methods
SetProp(key string, value interface{}) *minima
GetProp(key string) interface{}
}
type Res interface {
//response interface is built over http.ResponseWriter for easy and better utility
//returns minima.OutgoingHeader interface
Header() *OutgoingHeader
//Utility functions for easier usage
Send(content string) *Response //send content
WriteBytes(bytes []byte) error //writes bytes to the page
Json(content interface{}) *Response //sends data in json format
Error(status int, str string) *Response
//This functions return http.ResponseWriter instace that means you could use any of your alrady written middlewares in minima!!
Raw() http.ResponseWriter
//renders a html file with data to the page
Render(path string, data interface{}) *Response
//Redirects to given url
Redirect(url string) *Response
//Sets Header status
Status(code int) *Response
}
type Req interface {
//Minima request interface is built on http.Request
//returns param from route url
GetParam(name string) string
//returns path url from the route
GetPathURl() string
//returns raw request body
Body() map[string][]string
//finds given key value from body and returns it
GetBodyValue(key string) []string
//returns instance of minima.IncomingHeader for incoming header requests
Header() *IncomingHeader
//returns route method ex.get,post
Method() string
//Gets query params from route and returns it
GetQuery(key string) string
}
func MyMiddleWare(res *minima.Response, req *minima.Request) {
w := res.Raw() //raw http.ResponseWriter instance
r := req.Raw() //raw http.Request instance
//your normal net/http middleware
w.Write([]byte(r.URL.Path))
}