Less talk, more code

The blog of Iskandar Soesman

Simpel RESTFul API dengan Go

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