iLib merupakan tugas dari matkul Pemrograman Integratif yang dibuat oleh Muhammad Hilmi Ramadhan dengan NRP 05311940000044 pada project-2. Restful API ini mensimulasikan dari sekumpulan data author yang tersedia pada API ini. Yang mana hal ini dibuild menggunakan bahasa pemrograman Go dengan framework echo labstack tepatnya pada versi v4. API ini memiliki 4 metode dan 4 endpoint yang berbeda, yang mana untuk melengkapi syarat dari Authentication maka disini saya menerapkan JWT Token yang juga akan berkaitan dengan Authorization nya nanti. Secara sederhana jika bukan pengguna terdaftar maka pengguna tersebut hanya dapat mengakses metode GET dari author yang tersedia pada database, akan tetapi jika pengguna terdaftar dalam artian melakukan login terlebih dahulu yang mana nantinya juga memiliki JWT Token yang mengakibatkan pengguna tersebut dapat mengakses iLib Restful API secara penuh ke - 4 method yang telah di buat (GET, POST, PUT, DELETE).
- Pastikan sudah terinstal
Golangbeserta denganEcho labstack frameworknya. Jika belum silahkan klik tautan berikut :
Golang Windows , Golang Linux, Golang MacOS, dan Echo Labstack Framework - Jika telah tersedia point 1 pada device anda, maka letakkan project ini pada
GO-PATHyang telah didefinisikan saat instalasiGolang. - Selanjutnya lakukan inisialisasi dengan command pada terminal/shell anda
go mod initdango mod tidyuntuk otomatisasi import terhadaplibrary/file-filependukung yang dibutuhkan. Tak lupa, jika pada headerfile import gojuga disesuaikan terhadap penyimpananfoldering devicemasing-masing. - Lalu lakukan
run and executionprogram dengan command
go run main.go
-
HTTP Requests
Segala permintaan yang dikirim olehAPIdibuat seaman mungkin menggunakan HTTPS dengan salah satu metode berikut, yang mana bergantung darireqeustyang diambil :GETyang berguna untuk mendapatkan seluruh list yang ada dari resourcesPOSTyang berguna untuk menambah atau membuat sebuah inputan data yang baru terhadap resourcesPUTyang berguna untuk melakukan edit data dari yang telah tersedia dari resourcesDELETEyang berguna untuk menghapus data yang tersedia dari resources
Terkhusus padametode POST & PUTpadabody requestharus dilengkapi beberapa parameter padaheaderkhusus seperti diantaranya jika padaPOSTharus menyertakanNama_authoryang akan ditargetkan dan padaPUTharus menyertakanId_authordanNama_author.
-
HTTP Responses
Setiap response yang dikembalikan darirequests methodakan mengembalikanstatusdan jika berhasil maka akan ditampilkan dalam bentukjson single-record queries and an array for list queries. Tidak hanya itu, akan diberikan juga sebuah pesan berupamessage : "Success"jika berhasil dan yang terakhir tentunyadatayang berupajson array for list queries. Adapun contohnya sebagai berikut :
{
"status": 200,
"message": "Success",
"data": [
{
"id": 1,
"nama": "Archibald Gislason"
},
{
"id": 2,
"nama": "Mr. Saul Muller DDS"
},
{
"id": 3,
"nama": "Virgie Paucek I"
},
{
"id": 4,
"nama": "Anastacio Cremin"
},
{
"id": 5,
"nama": "Cody Eichmann"
},
{
"id": 6,
"nama": "Stanford Hirthe"
},
{
"id": 7,
"nama": "Efrain Ullrich"
},
{
"id": 8,
"nama": "Dr. Carmel Bergstrom IV"
},
{
"id": 9,
"nama": "Prof. Rosendo Price I"
},
{
"id": 10,
"nama": "Demarco Carroll"
},
{
"id": 11,
"nama": "Chadrick Howell"
},
{
"id": 12,
"nama": "Prof. Jerry Labadie"
},
{
"id": 13,
"nama": "Mr. Columbus Wisoky"
},
{
"id": 14,
"nama": "Jody Hodkiewicz"
},
{
"id": 15,
"nama": "Carmen Bechtelar II"
},
{
"id": 16,
"nama": "Alfreda Kilback"
},
{
"id": 17,
"nama": "Prof. Vallie Fay PhD"
},
{
"id": 18,
"nama": "Caroline Mills"
},
{
"id": 19,
"nama": "Jules Ullrich"
},
{
"id": 20,
"nama": "Nadia Greenholt"
},
{
"id": 21,
"nama": "R.V. Hari Ginardi"
},
{
"id": 22,
"nama": "Baskoro Adi Pratomo"
},
{
"id": 24,
"nama": "Bapak Ridho Rahman Hariadi"
}
]
}- HTTP Response Codes
Setiap response akan dikembalikan melaluiHTTP status codesebagai berikut :200OKyang bermakna requests yang diminta berhasil di dapatkan.400Bad Requestyang bermakna terjadi sebuah kesalahan terhadap requests nya (security, malformed, data validation, dll.)401Unauthorizedyang bermakna bahwaAPIgagal mengenali kredensial dari validasinya.403Forbiddenyang bermakna bahwa kredensial tidak dapat memiliki akses terhadap resources yang diminta.404Method not allowedyang bermakna bahwa resources tidak tepat dalam pengaksesanmethodnya. (Membutuhkan requestsmethodyang spesifik sepertiGET,POST, dll).500Server Erroryang bermakna bahwa terjadi kegalatan yang disebabkan oleh server (Bisa server blm menyala dari mysqlnya ataupun hal lain).
-
GET
Padametodeini siapapun dapat melihat isi dariendpointini tanpa perlu adanyaloginatauAuthenticationdenganJWT TokenGET/localhost:1234/authorContoh Code Go
func get() { fmt.Println("1. Performing Http Get...") resp, err := http.Get("https://localhost:1234/author") if err != nil { log.Fatalln(err) } defer resp.Body.Close() bodyBytes, _ := ioutil.ReadAll(resp.Body) // Convert response body to string bodyString := string(bodyBytes) fmt.Println("API Response as String:\n" + bodyString) // Convert response body to Todo struct var todoStruct Todo json.Unmarshal(bodyBytes, &todoStruct) fmt.Printf("API Response as struct %+v\n", todoStruct) }
Response
Status : 200{ "status": 200, "message": "Success", "data": [ { "id": 1, "nama": "Archibald Gislason" }, { "id": 2, "nama": "Mr. Saul Muller DDS" } ] }
-
POST
Padametodeini hanya pengguna terdaftar yang dapat mengaksesendpointtentunya memerlukanloginatauAuthenticationdenganJWT Tokenyang telah didapat dimasukan ke dalamBearer Tokennya.metodeini memungkinkan pengguna terdaftar untuk menambahkan penulis padaiLib Perpustakaan APIPOST/localhost:1234/authorAuthorization
Type Token Bearer Token eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHBfZGF0ZSI6MTYyMDYzOTE5NiwibGV2ZWwiOiJBcHBsaWNhdGlvbiIsInVzZXJuYW1lIjoibWhpbG1pIn0.Kfpzf7VSO_-STPFxhUs7uHq4v-I0iStg8riOrPIEZww
Parameters
KEY VALUE Nama_author Bapak Ridho Rahman Hariadi
Contoh Code Go
func post() { fmt.Println("2. Performing Http Post...") todo := Todo{1, 2, "lorem ipsum dolor sit amet", true} jsonReq, err := json.Marshal(todo) resp, err := http.Post("https://localhost:1234/author", "application/json; charset=utf-8", bytes.NewBuffer(jsonReq)) if err != nil { log.Fatalln(err) } defer resp.Body.Close() bodyBytes, _ := ioutil.ReadAll(resp.Body) // Convert response body to string bodyString := string(bodyBytes) fmt.Println(bodyString) // Convert response body to Todo struct var todoStruct Todo json.Unmarshal(bodyBytes, &todoStruct) fmt.Printf("%+v\n", todoStruct) }
Response
Status : 200{ "status": 200, "message": "Success", "data": { "Id yang terakhir dimasukan adalah": 24 } }
-
PUT
Padametodeini hanya pengguna terdaftar yang dapat mengaksesendpointtentunya memerlukanloginatauAuthenticationdenganJWT Tokenyang telah didapat dimasukan ke dalamBearer Tokennya.metodeini memungkinkan pengguna terdaftareditdata dari resourcesauthoryang ada padaAPIini.PUT/localhost:1234/authorAuthorization
Type Token Bearer Token eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHBfZGF0ZSI6MTYyMDYzOTE5NiwibGV2ZWwiOiJBcHBsaWNhdGlvbiIsInVzZXJuYW1lIjoibWhpbG1pIn0.Kfpzf7VSO_-STPFxhUs7uHq4v-I0iStg8riOrPIEZww
Parameters
KEY VALUE Id_author 1 Nama_author Muhammad Hilmi Ramadhan
Contoh Code Go
func put() { fmt.Println("3. Performing Http Put...") todo := Todo{1, 2, "lorem ipsum dolor sit amet", true} jsonReq, err := json.Marshal(todo) req, err := http.NewRequest(http.MethodPut, "https://localhost:1234/author", bytes.NewBuffer(jsonReq)) req.Header.Set("Content-Type", "application/json; charset=utf-8") client := &http.Client{} resp, err := client.Do(req) if err != nil { log.Fatalln(err) } defer resp.Body.Close() bodyBytes, _ := ioutil.ReadAll(resp.Body) // Convert response body to string bodyString := string(bodyBytes) fmt.Println(bodyString) // Convert response body to Todo struct var todoStruct Todo json.Unmarshal(bodyBytes, &todoStruct) fmt.Printf("API Response as struct:\n%+v\n", todoStruct) }
Response
Status : 200{ "status": 200, "message": "Success", "data": { "Data terupdate sebanyak": 1 } }
-
DELETE
Padametodeini hanya pengguna terdaftar yang dapat mengaksesendpointtentunya memerlukanloginatauAuthenticationdenganJWT Tokenyang telah didapat dimasukan ke dalamBearer Tokennya.metodeini memungkinkan pengguna terdaftardeletedata dari resourcesauthoryang ada padaAPIini.DELETE/localhost:1234/authorAuthorization
Type Token Bearer Token eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHBfZGF0ZSI6MTYyMDYzOTE5NiwibGV2ZWwiOiJBcHBsaWNhdGlvbiIsInVzZXJuYW1lIjoibWhpbG1pIn0.Kfpzf7VSO_-STPFxhUs7uHq4v-I0iStg8riOrPIEZww
Parameters
KEY VALUE Id_author 24
Contoh Code Go
func delete() { fmt.Println("4. Performing Http Delete...") todo := Todo{1, 2, "lorem ipsum dolor sit amet", true} jsonReq, err := json.Marshal(todo) req, err := http.NewRequest(http.MethodDelete, "https://localhost:1234/author", bytes.NewBuffer(jsonReq)) client := &http.Client{} resp, err := client.Do(req) if err != nil { log.Fatalln(err) } defer resp.Body.Close() bodyBytes, _ := ioutil.ReadAll(resp.Body) // Convert response body to string bodyString := string(bodyBytes) fmt.Println(bodyString) }
Response
Status : 200{ "status": 200, "message": "Success", "data": { "Data terhapus sebanyak": 1 } }
Pada project ini saya mengenakan bantuan dari JWT yang mana saya integrasikan dari library tautan berikut https://wwww.github.com/dgrijalva/jwt-go. Pada dasarnya JWT akan muncul ketika pengguna melakukan validasi login sederhana yang dengan kata lain pengguna harus terdaftar terlebih dahulu di database guna dapat mengakses ke-4 metode dari Restful API yang telah dibuat. Oleh karena itu saya telah menyiapkan sebuah akun dummy dengan username : mhilmi dan password : asdf. Secara konseptual nantinya akan di cocokan antara password plainteks dengan password cipherteks yang telah dikonversikan ke bentuk bcrypt. Berikut merupakan gambar dari JWT Token yang diperoleh oleh user setelah melakukan validasi login sederhana melalui POSTMAN :

Gambar diatas dapat diperoleh melalui metode POST dengan mengarahkan url ke localhost:1234/login?username=mhilmi&password=asdf
Adapun untuk Authorization dan Authentication untuk Guest atau pengguna tidak terdaftar tanpa melalui login maka yang dapat diakses hanya metode GET dari Penulis Buku yang tersedia di database seperti gambar berikut :

Postman merupakan sebuah tools dan testing dari sebuah API. Disini akan ditunjukan bagaimana melakukan konfigurasi sebagaimana mestinya agar iLib Restful API dapat dicoba :
- Pertama-tama maka buatlah sebuah collection khusus guna menampung foldering dari testing
iLib API

- Setelah sudah diberi nama bebas, maka berikut salah satu contoh testing dengan metode
POSTdalam menambahkan author.Tentunya dengan melalui otentikasiJWT Tokenterelebih dahulu dengan login melaluiPostmanyang me-returnJWT, kemudian baru dapat melakukanPOST. Pada kasus ini akan login denganusernamemhilmi danpasswordasdf
sehingga url untuk mendapatkanJWT Tokenakan berubah menjadilocalhost:1234/login?username=mhilmi&password=asdf
Setelah mendapatkantokenseperti diatas, maka mari kita coba untukPOSTnya, sebelum itu maka set terlebih dahulu padaAuthorizationkita masukanBearer Tokenyang di dapat dariJWT Tokensetelah login tadi dengan urllocalhost:1234/authorsebagai berikut :
Mari kita coba untuk POST
Dan telah berhasil. Kira kira seperti itu dalam tutorial postman dalam pengujian dari iLib Restful API.