The blog of Iskandar Soesman
Pada artikel kali ini kita akan membuat sebuah aplikasi RESTFul sederhana menggunakan Go. Untuk pengenalan lebih jauh tentang bahasa pemrogarman Go, kamu bisa baca pada artikel Pengenalan Bahasa Pemrogaman Go.
Kita akan membuat sebuah service yang mengelola daftar nama dan nomor telpon. Diasumsikan, setiap data orang yang akan kita simpan bisa memiliki satu nomor handphone dan satu nomor rumah.
Pertama-tama buat sebuah folder dengan nama phone-book
di dalam GOPATH
workingspace.
mkdir -p $GOPATH/src/phone-book
cd $GOPATH/src/phone-book
Buat sebuah file dengan nama main.go
di dalam folder ini, lalu isikan package-package yang akan kita butuhkan:
package main
import (
"encoding/json"
"fmt"
"log"
"net/http"
"strconv"
"github.com/gorilla/mux"
)
Selanjutnya kita membutuhkan sebuah struct
untuk data json yang akan kita gunakan. Struct adalah koleksi tipe data dari masing-masing property yang ada pada data json. Kita juga membutuhkan sebuah variable friends
untuk menampung kumpulan data yang akan disimpan.
type Person struct {
ID string `json:"id,omitempty"`
Name string `json:"name,omitempty"`
Email string `json:"email,omitempty"`
Phone *Phone `json:"phone,omitempty"`
}
type Phone struct {
Handphone string `json:"handphone,omitempty"`
Phone string `json:"phone,omitempty"`
}
var friends []Person
Untuk membantu routing akses aplikasi, kita membutuhkan sebuah package yang bernama mux
. Jalankan perintah berikut untuk mendownload package tersebut.
go get github.com/gorilla/mux
Isikan fungsi main
seperti berikut:
func main() {
router := mux.NewRouter()
router.HandleFunc("/", func(w http.ResponseWriter, r *http.Request){
w.Header().Set("Content-Type", "application/json")
w.Write("{\"hello\":\"world\"}")
}).Methods("GET")
log.Fatal(http.ListenAndServe(":8000", router))
}
Kemudian jalankan di browser dengan alamat http://localhost:8000 Jika muncul tampilan {"hello":"world"} maka hingga tahap ini proses kita berjalan lancar.
package main
import (
"encoding/json"
"fmt"
"log"
"net/http"
"strconv"
"github.com/gorilla/mux"
)
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,omitempty"`
}
var friends []Person
func getPeople(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(people)
}
func getPerson(w http.ResponseWriter, r *http.Request) {
params := mux.Vars(r)
for _, item := range people {
if item.ID == params["id"] {
json.NewEncoder(w).Encode(item)
return
}
}
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(&Person{})
}
func createPerson(w http.ResponseWriter, r *http.Request) {
// params := mux.Vars(r)
ID := strconv.Itoa(len(people) + 1)
var person Person
_ = json.NewDecoder(r.Body).Decode(&person)
person.ID = ID
people = append(people, person)
w.Header().Set("Content-Type", "application/json")
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
}
}
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(people)
}
func main() {
people = append(people, Person{ID: "1", Firstname: "John", Lastname: "Doe", Address: &Address{City: "City X", State: "State X"}})
people = append(people, Person{ID: "2", Firstname: "Koko", Lastname: "Doe", Address: &Address{City: "City Z", State: "State Y"}})
people = append(people, Person{ID: "3", Firstname: "Francis", Lastname: "Sunday"})
router := mux.NewRouter()
router.HandleFunc("/people", getPeople).Methods("GET")
router.HandleFunc("/people/{id}", getPerson).Methods("GET")
router.HandleFunc("/people", createPerson).Methods("POST")
router.HandleFunc("/people/{id}", deletePerson).Methods("DELETE")
log.Fatal(http.ListenAndServe(":8000", router))
fmt.Println("Hello, playground")
}