Go Lang: Base REST API


Base REST API

package main

import (
    "encoding/json"
    "fmt"
    "net/http"
    "strconv"
)

type JsonResponseString struct {
    Status  int    `json:"status"`
    Message string `json:"msg"`
}

type JsonResponsesSlice struct {
    Status  int       `json:"status"`
    Message []Cookies `json:"msg"`
}

type JsonResponse struct {
    Status  int     `json:"status"`
    Message Cookies `json:"msg"`
}

type Cookies struct {
    ID       int    `json:"id"`
    Name     string `json:"name"`
    Fillings string `json:"fillings"`
    Weight   int    `json:"weight"`
}

var (
    cookieList = []Cookies{}
    lastID     int
)

func main() {
    mux := http.NewServeMux()

    mux.HandleFunc("GET /healthcheck", healthCheck)
    mux.HandleFunc("GET /cookies", getCookies)
    mux.HandleFunc("GET /cookies/{id}", getCookie)
    mux.HandleFunc("POST /cookies", addCookies)
    mux.HandleFunc("PUT /cookies/{id}", updateCookies)
    mux.HandleFunc("DELETE /cookies/{id}", deleteCookies)

    server := &http.Server{
        Addr:    "0.0.0.0:8080",
        Handler: mux,
    }
    fmt.Printf("Listening port 8080\n")
    server.ListenAndServe()
}

func healthCheck(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")
    json.NewEncoder(w).Encode(JsonResponseString{Status: 200, Message: http.StatusText(200)})
}

func getCookies(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")
    json.NewEncoder(w).Encode(JsonResponsesSlice{Status: 200, Message: cookieList})
}

func getCookie(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")

    id, error := strconv.Atoi(r.PathValue("id"))
    if error != nil {
        json.NewEncoder(w).Encode(JsonResponseString{Status: 400, Message: "Invalid id"})
        return
    }

    for _, cookie := range cookieList {
        if cookie.ID == id {
            json.NewEncoder(w).Encode(JsonResponse{Status: 200, Message: cookie})
            return
        }
    }
    json.NewEncoder(w).Encode(JsonResponseString{Status: 404, Message: "User not found"})
}

func addCookies(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")
    var cookie Cookies
    if error := json.NewDecoder(r.Body).Decode(&cookie); error != nil {
        json.NewEncoder(w).Encode(JsonResponseString{Status: 400, Message: "Invalid request payload"})
        return
    }
    lastID++
    cookie.ID = lastID

    cookieList = append(cookieList, cookie)
    w.WriteHeader(http.StatusCreated)
    json.NewEncoder(w).Encode(JsonResponse{Status: 201, Message: cookie})
}

func updateCookies(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")

    id, error := strconv.Atoi(r.PathValue("id"))
    if error != nil {
        json.NewEncoder(w).Encode(JsonResponseString{Status: 400, Message: "Invalid id"})
        return
    }

    var newCookie Cookies
    if err := json.NewDecoder(r.Body).Decode(&newCookie); err != nil {
        json.NewEncoder(w).Encode(JsonResponseString{Status: 400, Message: "Invalid request payload"})
        return
    }

    for i, cookie := range cookieList {
        if cookie.ID == id {

            cookieList[i].Name = newCookie.Name
            cookieList[i].Fillings = newCookie.Fillings
            cookieList[i].Weight = newCookie.Weight

            json.NewEncoder(w).Encode(JsonResponse{Status: 200, Message: cookieList[i]})
            return
        }
    }
    json.NewEncoder(w).Encode(JsonResponseString{Status: 404, Message: "User not found"})

}

func deleteCookies(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")

    id, error := strconv.Atoi(r.PathValue("id"))
    if error != nil {
        json.NewEncoder(w).Encode(JsonResponseString{Status: 400, Message: "Invalid id"})
        return
    }

    for i, cookie := range cookieList {
        if cookie.ID == id {
            cookieList = append(cookieList[:i], cookieList[i+1:]...)
            json.NewEncoder(w).Encode(JsonResponseString{Status: 200, Message: "Deleted"})
            return
        }
    }
    json.NewEncoder(w).Encode(JsonResponseString{Status: 404, Message: "User not found"})

}

Testing

Create object

$ curl -H "Content-Type: application/json" -X POST -d '{"name": "Oreo", "fillings": "cocoa", "weight": 450}' http://127.0.0.1:8080/cookies 2>/dev/null| jq

output

{
  "status": 201,
  "msg": {
    "id": 1,
    "name": "Oreo",
    "fillings": "cocoa",
    "weight": 450
  }
}

Get object

$ curl http://127.0.0.1:8080/cookies 2>/dev/null| jq

output

{
  "status": 200,
  "msg": []
}

Get objects

$ curl http://127.0.0.1:8080/cookies 2>/dev/null| jq

output

{
  "status": 200,
  "msg": [
    {
      "id": 1,
      "name": "Oreo",
      "fillings": "cocoa",
      "weight": 450
    }
  ]
}

Update object

$ curl -H "Content-Type: application/json" -X PUT -d '{"name": "Oreo", "fillings": "cocoa", "weight": 500}' http://127.0.0.1:8080/cookies/1 2>/dev/null| jq

output

{
  "status": 200,
  "msg": {
    "id": 1,
    "name": "Oreo",
    "fillings": "cocoa",
    "weight": 500
  }
}

Delete object

$ curl -H "Content-Type: application/json" -X DELETE http://127.0.0.1:8080/cookies/1 2>/dev/null| jq

output

{
  "status": 200,
  "msg": "Deleted"
}