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"
}