Popularity
1.3
Declining
Activity
3.7
-
15
3
0

Description

ADK - Golang API Development Kit, has a set of utility libs to help write simple APIs and manage errors and responses better.

Programming language: Go
License: MIT License
Tags: Utilities     API     Error     Go     Golang     Error Handling     Decoder     Http-response    

ADK - Golang API Development Kit alternatives and similar packages

Based on the "Utilities" category.
Alternatively, view adk alternatives based on common mentions on social networks and blogs.

Do you think we are missing an alternative of ADK - Golang API Development Kit or a related project?

Add another 'Utilities' Package

README

ADK - Golang API Development Kit

CircleCI Go Report GolangCI License

GoDoc Reference:

  • api:
  • errors:
  • respond:

GOPHERCON 2022 | ADK - Golang API Development Kit


Common utilities to write simple apis in golang.

- 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

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

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.


*Note that all licence references and agreements mentioned in the ADK - Golang API Development Kit README section above are relevant to that project's source code only.