lifelong learner — urip iku urup, currently working on accenture.

Golang tutorial indonesia – API REST routing dengan mux

1
Degananda.com -

Mux (Bukan merk mobil)

Mux adalah package routing yang dibuat oleh gorilla toolkit untuk golang. Kita menggunakan package untuk mempersingkat waktu development router. Jika anda tidak menggunakan package dalam routing maka harus melakukan parsing url. Karena dalam go “/note” dan “/note/1” dihitung dalam satu route. Sehingga untuk dapat membuat mekanisme routing yang benar diperlukan melakukan parsing manual terhadap request url serta memfilter http method dalam request tersebut(GET/POST/PUT/DELETE/DLL).

Dengan menggunakan mux maka proses parsing dan filter terhadap berbagai parameter dalam http request telah dihandle oleh package mux tersebut. Sehingga kita tidak perlu memikirkan routing dan dapat fokus menyelesaikan solusi untuk proses bisnis yang kita hadapi.

Programming itu susah gunakan library / package untuk meningkatkan efisiensi

Installasi Mux

Sebelum anda melakukan install mux pastikan go anda telah terinstall dan terkonfigurasi dengan baik. Untuk memastikan bahwa installasi berhasil dan terkonfigurasi(workspace) jalankan perintah dibawah ini

go env | grep "GOPATH"

jika terdapat GOPATH pada env variable maka go telah terinstall. Mux akan terinstall pada direktori sebagaimana terdapat digopath tersebut. Sehingga sesuaikan GOPATH dengan direktori project anda. Untuk mengganti GOPATH gunakan perintah

export GOPATH=lokasidirektori

setelah konfigurasi go maka kita install mux dengan menggunakan perintah

go get -u github.com/gorilla/mux

Implementasi mux pada golang

selain menggunakan mux terdapat package lain yang digunakan yakni

  1. net/http karena api(application programming interface) kita menggunakan http dengan method POST/GET/DELETE/PUT yakni mengikuti aturan pada REST
  2. fmt untuk memberikan response ke client yang merequest api. Ulasan ini hanya membahas routing tidak membahas mengenai response encode/json dan lain sebagainnya

1. Inisiasi router mux

Langsung saja kita membuat instances mux dengan menggunakan syntax mux.NewRouter() dan mendefinisikan route pertama kita yakni ke “/”.

package main

import "github.com/gorilla/mux"
import "net/http"
import "fmt"

func homeRoute(res http.ResponseWriter, req *http.Request) {
	fmt.Fprint(res, "<b>Hello world</b>")
}

func main() {
	router := mux.NewRouter()
	router.HandleFunc("/", homeRoute)
	http.ListenAndServe("localhost:1557", router)

}

HandleFunc adalah fungsi yang sebenarnya berasal dari net/http yang berguna untuk melakukan routing. Parameter pertama (“/”) merupakan endpoint dari routing. Sedangkan parameter kedua homeRoute adalah interface yang berisi logic yang dapat kita tuliskan di path tersebut.

Interface tersebut memiliki dua method yakni response dan request yang berasal dari package http. Response berada di http.ResponseWriter dan request berasal dari http.Request. Jangan lupa untuk menggunakan pointer pada http.Request karena http terbind / binded dengan variable http dimemory.

Kemudian terahir kita jalankan http server pada port 1557(silahkan tentukan port yang diguankan sesuai dengan preferensi anda, pastikan port tidak digunakan aplikasi lainnya) dan memasukan handler berupa router yang kita buat dengan menggunakan mux.

1.1 Testing

Arahkan browser anda ke localhost 1557 atau anda dapat menggunakan curl. Bebas silahkan pilih sesuai dengan keinginan. Kami menggunakan browser maka jika http server dan routing berjalan dengan baik anda akan melihat tulisan hello world dibrowser

2. Membuat REST Endpoint

selanjutnya kita akan membuat endpoint berdasarkan kaidah rest. Tetapi sebelumnya kita tentukan dahulu daftar endpointnya

Endpoint Http method
/note GET
/note/id, untuk mendapatkan data note berdasarkan id GET
/note/id, untuk mengubah note berdasarkan id PUT
/note/id, untuk menghapus note berdasarkan id DELETE
/note, untuk menambahkan note POST

kita tidak akan membuat logic dari setiap endpoint melainkan berfokus membuat rest endpoitnya. Mux memiliki kemampuan mendefinisikan endpoint beserta http methodnya dengan format sebagai berikut

router.HandleFunc("/path", interfaceHandler).Methods("GET/POST/DELETE/PUT")

sehingga berdasarkan format tersebut kita dapat membuat lima endpoint diatas dengan menggunakan kode seperti dibawah ini

package main

import "github.com/gorilla/mux"
import "net/http"
import "fmt"

func getNote(res http.ResponseWriter, req *http.Request) {
	fmt.Fprint(res, "<b>get note</b>")
}

func postNote(res http.ResponseWriter, req *http.Request) {
	fmt.Fprint(res, "<b>post note</b>")
}

func putNote(res http.ResponseWriter, req *http.Request) {
	routerParams := mux.Vars(req)
	fmt.Println(routerParams["id"])
	fmt.Fprint(res, "<b>put note</b>")
}

func deleteNote(res http.ResponseWriter, req *http.Request) {
	routerParams := mux.Vars(req)
	fmt.Println(routerParams["id"])
	fmt.Fprint(res, "<b>delete note</b>")
}

func getNoteDetail(res http.ResponseWriter, req *http.Request) {
	routerParams := mux.Vars(req)
	fmt.Println(routerParams["id"])
	fmt.Fprint(res, "<b>get note</b>")
}

func main() {
	router := mux.NewRouter()
	router.HandleFunc("/note", getNote).Methods("GET")
	router.HandleFunc("/note", postNote).Methods("POST")
	router.HandleFunc("/note/{id}", getNoteDetail).Methods("GET")
	router.HandleFunc("/note/{id}", putNote).Methods("PUT")
	router.HandleFunc("/note/{id}", deleteNote).Methods("DELETE")

	http.ListenAndServe("localhost:1557", router)

}

Done kita telah berhasil membuat endpoint dengan menggunakan mux serta net/http langkah selanjutnya adalah mengisi handler pada masing-masing endpoint dengan logic application dan menghubungkannya dengan database.

mux.Vars(request) digunakan untuk mengambil parameter yang ada para request url. Contoh diatas parameter yang diambil adalah “ID” yang merupakan id dari note. Anda dapat melakukan uji coba dengan menggunakan postman/restclient untuk menguji coba tiap endpoint

  • Winna Lucas

    kk mau tny utk pemasangan iklan betting disitus degananda.com diperbolehkan ga?
    klo bole bisa minta daftar harga perbulan utk masing2 posisi banner?

    terima kasih