https://github.com/manigandand/adk
Golang API Development Kit
https://github.com/manigandand/adk
api api-rest go-chi golang golang-library gorrila
Last synced: about 1 year ago
JSON representation
Golang API Development Kit
- Host: GitHub
- URL: https://github.com/manigandand/adk
- Owner: manigandand
- License: mit
- Created: 2022-09-07T19:06:41.000Z (almost 4 years ago)
- Default Branch: master
- Last Pushed: 2023-10-05T08:25:07.000Z (almost 3 years ago)
- Last Synced: 2025-03-30T17:51:14.898Z (over 1 year ago)
- Topics: api, api-rest, go-chi, golang, golang-library, gorrila
- Language: Go
- Homepage:
- Size: 54.7 KB
- Stars: 15
- Watchers: 2
- Forks: 0
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- License: LICENSE
- Code of conduct: CODE_OF_CONDUCT.md
Awesome Lists containing this project
README
## ADK - Golang API Development Kit
[](https://circleci.com/gh/manigandand/adk/tree/master)
[](https://goreportcard.com/report/github.com/manigandand/adk)
[](https://golangci.com/r/github.com/manigandand/adk)
[](https://github.com/manigandand/adk/blob/master/LICENSE)
[](https://godoc.org/github.com/manigandand/adk)
**GoDoc Reference:**
- api: [](https://godoc.org/github.com/manigandand/adk/api)
- errors: [](https://godoc.org/github.com/manigandand/adk/errors)
- respond: [](https://godoc.org/github.com/manigandand/adk/respond)
---
[](https://www.youtube.com/watch?v=opReKsCXsA0)
---
Common utilities to write simple apis in golang.
```shell
- Custom API Handlers
- Custom API Request(JSON) Decoders
- Custom API URL Query-params Decoders using gorrila schema.
- App Errors
- Response Writers
```
> Ex: **Conventional way of writing api**
```go
package main
import (
"net/http"
"github.com/go-chi/chi/v5"
"github.com/go-chi/chi/v5/middleware"
)
func main() {
r := chi.NewRouter()
r.Use(middleware.Logger)
r.Post("/user", CreateUserHandler)
http.ListenAndServe(":3000", r)
}
// CreateUserHandler creates a new users
func CreateUserHandler(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
reqBts, err := ioutil.ReadAll(r.Body)
if err != nil {
w.Header().Add("Content-Type", "application/json")
w.WriteHeader(http.StatusBadRequest)
w.Write([]byte(`{"error": "Couldn't read request body"}`))
return
}
var createReq createUserReq
jErr := json.Unmarshal(reqBts, &createReq)
if jErr != nil {
w.Header().Add("Content-Type", "application/json")
w.WriteHeader(http.StatusBadRequest)
w.Write([]byte(`{"error": "invalid request body"}`))
return
}
if err := validateCreateUserReq(&createReq); err != nil {
w.Header().Add("Content-Type", "application/json")
w.WriteHeader(http.StatusBadRequest)
w.Write([]byte(`{"error": "invalid request body"}`))
return
}
if err := store.CreateUser(&createReq); err != nil {
w.Header().Add("Content-Type", "application/json")
w.WriteHeader(http.StatusInternalServerError)
w.Write([]byte(`{"error": "invalid request body"}`))
return
}
// respond to the client
w.Header().Add("Content-Type", "application/json")
w.WriteHeader(http.StatusOK)
w.Write([]byte(`{"message": "user created successfully", "id": 123}`))
}
```
### After using custom handlers and ADK
```go
package main
import (
"net/http"
"github.com/manigandand/adk/api"
"github.com/manigandand/adk/errors"
"github.com/manigandand/adk/middleware"
"github.com/manigandand/adk/respond"
"github.com/go-chi/chi/v5"
)
func main() {
r := chi.NewRouter()
r.Use(middleware.Logger)
r.Use(middleware.Recoverer)
r.Method(http.MethodPost, "/user", api.Handler(CreateUserHandler))
http.ListenAndServe(":3000", r)
}
type createUserReq struct {
Email string `json:"email"`
Name string `json:"name"`
}
func (c *createUserReq) Validate() *errors.AppError {
if c.Email == "" {
return errors.KeyRequired("email")
}
return nil
}
// CreateUserHandler creates a new users
func CreateUserHandler(w http.ResponseWriter, r *http.Request) *errors.AppError{
ctx := r.Context()
var createReq createUserReq
if err := api.Decode(r, &createReq); err != nil {
return err
}
if err := store.CreateUser(&createReq); err != nil {
return err
}
// respond to the client
return respond.OK(w, map[string]interface{}{
"message": "user created successfully",
"id": 123,
})
}
```
> NOTE:
> Decoder currently will work on only on the `"application/json"` body.