ref: dc8c8c3b916f687cdba3bd3dc8c9dc79cff2cbb9 simple-rest-api/main.go -rw-r--r-- 2.4 KiB View raw
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
/*
	Golang Project
	Followed: https://www.codementor.io/codehakase/building-a-restful-api-with-golang-a6yivzqdo
*/

package main

// packages we want to import
import (
	"encoding/json"
	"github.com/gorilla/mux" // mux = HTTP request multiplexer
	"log"
	"net/http"
)

// data objects
type Person struct {
	ID        string   `json:"id,omitempty"`
	Firstname string   `json:"firstname,omitempty"`
	Lastname  string   `json:"lastname,omitempty"`
	Address   *Address `json:"address,omitempty"`
}
type Address struct {
	City  string `json:"city,omitempty"`
	State string `json:"state,omitemtpy`
}

// array to hold our people
// fine for an example, but this wouldn't be realistic in production
var people []Person

// our main function
func main() {
	// create the router
	router := mux.NewRouter()

	// add people to people array
	people = append(people, Person{ID: "1", Firstname: "John", Lastname: "Doe", Address: &Address{City: "Norfolk", State: "Virginia"}})
	people = append(people, Person{ID: "2", Firstname: "David", Lastname: "Doe", Address: &Address{City: "Tampa", State: "Florida"}})
	people = append(people, Person{ID: "3", Firstname: "Eduardo", Lastname: "Mardini"})

	// create the routes
	router.HandleFunc("/people", GetPeople).Methods("GET")
	router.HandleFunc("/people/{id}", GetPerson).Methods("GET")
	router.HandleFunc("/people/{id}", CreatePerson).Methods("POST")
	router.HandleFunc("/people/{id}", DeletePerson).Methods("DELETE")

	// start listening
	log.Fatal(http.ListenAndServe(":8000", router))
}

/* -------------------- ROUTES -------------------- */

func GetPeople(w http.ResponseWriter, r *http.Request) {
	json.NewEncoder(w).Encode(people) // return the people array
}

func GetPerson(w http.ResponseWriter, r *http.Request) {
	params := mux.Vars(r)
	for _, item := range people { // loop through the mapped names to check if the id param sent match any in the Person struct
		if item.ID == params["id"] {
			json.NewEncoder(w).Encode(item)
			return
		}
	}
}

func CreatePerson(w http.ResponseWriter, r *http.Request) {
	params := mux.Vars(r)
	var person Person
	_ = json.NewDecoder(r.Body).Decode(&person)
	person.ID = params["id"]
	people = append(people, person)
	json.NewEncoder(w).Encode(people)
}

func DeletePerson(w http.ResponseWriter, r *http.Request) {
	params := mux.Vars(r)
	for index, item := range people {
		if item.ID == params["id"] {
			people = append(people[:index], people[index+1])
			break
		}
		json.NewEncoder(w).Encode(people)
	}
}