raviMukti / training-golang-web

Training Golang Web dari ProgrammerZamanNow

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Training-Golang-Web

  • Pada beberapa bahasa pemrograman lain, seperti Java misalnya, untuk membuat web biasanya dibutuhkan tambahan library atau framework
  • Sedangkan di Go-Lang sudah disediakan package untuk membuat web bernama package net/http Sehingga untuk membuat web menggunakan Go-Lang, kita tidak butuh lagi library tambahan, kita bisa menggunakan package yang sudah tersedia
  • Walaupun memang saat kita akan membuat web dalam skala besar, direkomendasikan menggunakan framework karena beberapa hal sudah dipermudah oleh web framework
  • Namun pada course ini, kita akan fokus menggunakan package net/http untuk membuat web nya, karena semua framework web Go-Lang akan menggunakan net/http sebagai basis dasar framework nya
  • Server adalah struct yang terdapat di package net/http yang digunakan sebagai representasi Web Server di Go-Lang. Untuk membuat web, kita wajib membuat Server, saat membuat data Server, ada beberapa hal yang perlu kita tentukan, seperti host dan juga port tempat dimana Web kita berjalan .Setelah membuat Server, kita bisa menjalankan Server tersebut menggunakan function ListenAndServe()
  • Server hanya bertugas sebagai Web Server, sedangkan untuk menerima HTTP Request yang masuk ke Server, kita butuh yang namanya Handler Handler di Go-Lang di representasikan dalam interface, dimana dalam kontraknya terdapat sebuah function bernama ServeHTTP() yang digunakan sebagai function yang akan di eksekusi ketika menerima HTTP Request. Salah satu implementasi dari interface Handler adalah HandlerFunc .Kita bisa menggunakan HandlerFunc untuk membuat function handler HTTP
  • ServeMux adalah implementasi Handler yang bisa mendukung multiple endpoint, tidak seperti HandlerFunc yang hanya mendukung satu endpoint. URL Pattern dalam ServeMux sederhana, kita tinggal menambahkan string yang ingin kita gunakan sebagai endpoint, tanpa perlu memasukkan domain web kita. Jika URL Pattern dalam ServeMux kita tambahkan di akhirnya dengan garis miring, artinya semua url tersebut akan menerima path dengan awalan tersebut, misal /images/ artinya akan dieksekusi jika endpoint nya /images/, /images/contoh, /images/contoh/lagi. Namun jika terdapat URL Pattern yang lebih panjang, maka akan diprioritaskan yang lebih panjang, misal jika terdapat URL /images/ dan /images/thumbnails/, maka jika mengakses /images/thumbnails/ akan mengakses /images/thumbnails/, bukan /images
  • Request adalah struct yang merepresentasikan HTTP Request yang dikirim oleh Web Browser. Semua informasi request yang dikirim bisa kita dapatkan di Request. Seperti, URL, http method, http header, http body, dan lain-lain
  • Go-Lang sudah menyediakan package khusus untuk membuat unit test terhadap fitur Web yang kita buat. Semuanya ada di dalam package net/http/httptest. Dengan menggunakan package ini, kita bisa melakukan testing handler web di Go-Lang tanpa harus menjalankan aplikasi web nya. NewRequest(method, url, body) merupakan function yang digunakan untuk membuat http.Request. Selain itu, kita juga bisa menambahkan informasi tambahan lainnya pada request yang ingin kita kirim, seperti header, cookie, dan lain-lain. httptest.NewRecorder() merupakan function yang digunakan untuk membuat ResponseRecorder. ResponseRecorder merupakan struct bantuan untuk merekam HTTP response dari hasil testing yang kita lakukan
  • Query parameter adalah salah satu fitur yang biasa kita gunakan ketika membuat web. Untuk menambahkan query parameter, kita bisa menggunakan ?nama=value pada URL nya. Dalam parameter Request, terdapat attribute URL yang berisi data url.URL. Dari data URL ini, kita bisa mengambil data query parameter yang dikirim dari client dengan menggunakan method Query() yang akan mengembalikan map. Dalam spesifikasi URL, kita bisa menambahkan lebih dari satu query parameter. Untuk menambahkan query parameter, kita bisa gunakan tanda & lalu diikuti dengan query parameter berikutnya
  • Sebenarnya URL melakukan parsing query parameter dan menyimpannya dalam map[string][]string. Artinya, dalam satu key query parameter, kita bisa memasukkan beberapa value. Caranya kita bisa menambahkan query parameter dengan nama yang sama, namun value berbeda, misal : name=Eko&name=Kurniawan
  • Header adalah informasi tambahan yang biasa dikirim dari client ke server atau sebaliknya. Jadi dalam Header, tidak hanya ada pada HTTP Request, pada HTTP Response pun kita bisa menambahkan informasi header. Saat kita menggunakan browser, biasanya secara otomatis header akan ditambahkan oleh browser, seperti informasi browser, jenis tipe content yang dikirim dan diterima oleh browser, dan lain-lain. Untuk menangkap request header yang dikirim oleh client, kita bisa mengambilnya di Request.Header. Header mirip seperti Query Parameter, isinya adalah map[string][]string. Berbeda dengan Query Parameter yang case sensitive, secara spesifikasi, Header key tidaklah case sensitive. Sedangkan jika kita ingin menambahkan header pada response, kita bisa menggunakan function ResponseWriter.Header()
  • Jika menggunakan POST, maka semua data di form akan dikirim via body HTTP request. Semua data form post yang dikirim dari client, secara otomatis akan disimpan dalam attribute Request.PostForm. Namun sebelum kita bisa mengambil data di attribute PostForm, kita wajib memanggil method Request.ParseForm() terlebih dahulu, method ini digunakan untuk melakukan parsing data body apakah bisa di parsing menjadi form data atau tidak, jika tidak bisa di parsing, maka akan menyebabkan error
  • Response code merupakan representasi kode response. Dari response code ini kita bisa melihat apakah sebuah request yang kita kirim itu sukses diproses oleh server atau gagal. Secara default, jika kita tidak menyebutkan response code, maka response code nya adalah 200 OK. Jika kita ingin mengubahnya, kita bisa menggunakan function ResponseWriter.WriteHeader(int). Semua data status code juga sudah disediakan di Go-Lang, jadi kita ingin, kita bisa gunakan variable yang sudah disediakan : https://github.com/golang/go/blob/master/src/net/http/status.go
  • HTTP merupakan stateless antara client dan server, artinya server tidak akan menyimpan data apapun untuk mengingat setiap request dari client. Hal ini bertujuan agar mudah melakukan scalability di sisi server. Lantas bagaimana caranya agar server bisa mengingat sebuah client? Misal ketika kita sudah login di website, server otomatis harus tahu jika client tersebut sudah login, sehingga request selanjutnya, tidak perlu diminta untuk login lagi. Untuk melakukan hal ini, kita bisa memanfaatkan Cookie. Cookie adalah fitur di HTTP dimana server bisa memberi response cookie (key-value) dan client akan menyimpan cookie tersebut di web browser. Request selanjutnya, client akan selalu membawa cookie tersebut secara otomatis. Dan server secara otomatis akan selalu menerima data cookie yang dibawa oleh client setiap kalo client mengirimkan request. Cookie merupakan data yang dibuat di server dan sengaja agar disimpan di web browser. Untuk membuat cookie di server, kita bisa menggunakan function http.SetCookie()
  • Go-Lang memiliki sebuah fitur yang bernama FileServer. Dengan ini, kita bisa membuat Handler di Go-Lang web yang digunakan sebagai static file server. Dengan menggunakan FileServer, kita tidak perlu manual me-load file lagi. FileServer adalah Handler, jadi bisa kita tambahka ke dalam http.Server atau http.ServeMux
  • FileServer akan membaca url, lalu mencari file berdasarkan url nya, jadi jika kita membuat /static/index.js, maka FileServer akan mencari ke file /resources/static/index.js. Hal ini menyebabkan 404 Not Found karena memang file nya tidak bisa ditemukan. Oleh karena itu, kita bisa menggunakan function http.StripPrefix() untuk menghapus prefix di url
  • Dalam Go-Lang embed kita bisa embed file ke dalam binary distribution file, hal ini mempermudah sehingga kita tidak perlu meng-copy static file lagi. Go-Lang Embed juga memiliki fitur yang bernama embed.FS, fitur ini bisa diintegrasikan dengan FileServer. di Go-Lang embed, nama folder ikut menjadi nama resource nya, misal resources/index.js, jadi untuk mengaksesnya kita perlu gunakan URL /static/resources/index.js. Jika kita ingin langsung mengakses file index.js tanpa menggunakan resources, kita bisa menggunakan function fs.Sub() untuk mendapatkan sub directory
  • Kadang ada kasus misal kita hanya ingin menggunakan static file sesuai dengan yang kita inginkan. Hal ini bisa dilakukan menggunakan function http.ServeFile(). Dengan menggunakan function ini, kita bisa menentukan file mana yang ingin kita tulis ke http response
  • Parameter function http.ServeFile hanya berisi string file name, sehingga tidak bisa menggunakan Go-Lang Embed. Namun bukan berarti kita tidak bisa menggunakan Go-Lang embed, karena jika untuk melakukan load file, kita hanya butuh menggunakan package fmt dan ResponseWriter saja
  • Di Go-Lang terdapat fitur HTML Template, yaitu fitur template yang bisa kita gunakan untuk membuat HTML yang dinamis. Fitur HTML template terdapat di package html/template. Sebelum menggunakan HTML template, kita perlu terlebih dahulu membuat template nya. Template bisa berubah file atau string. Bagian dinamis pada HTML Template, adalah bagian yang menggunakan tanda {{ }}. Saat membuat template dengan string, kira perlu memberi tahu nama template nya. Dan untuk membuat text template, cukup buat text html, dan untuk konten yang dinamis, kita bisa gunakan tanda {{.}}, contoh : <html><body>{{.}}</body></html>
  • Selain membuat template dari string, kita juga bisa membuat template langsung dari file. Hal ini mempermudah kita, karena bisa langsung membuat file html. Saat membuat template menggunakan file, secara otomatis nama file akan menjadi nama template nya, misal jika kita punya file simple.html, maka nama template nya adalah simple.html
  • Kadang biasanya kita jarang sekali menyebutkan file template satu persatu. Alangkah baiknya untuk template kita simpan di satu directory. Go-Lang template mendukung proses load template dari directory. Hal ini memudahkan kita, sehingga tidak perlu menyebutkan nama file nya satu per satu menggunakan function ParseGlob
  • Sejak Go-Lang 1.16, karena sudah ada Go-Lang Embed, jadi direkomendasikan menggunakan Go-Lang embed untuk menyimpan data template. Menggunakan Go-Lang embed menjadi kita tidak perlu ikut meng-copy template file lagi, karena sudah otomatis di embed di dalam distribution file
  • Saat kita membuat template, kadang kita ingin menambahkan banyak data dinamis. Hal ini bisa kita lakukan dengan cara menggunakan data struct atau map. Namun perlu dilakukan perubahan di dalam text template nya, kita perlu memberi tahu Field atau Key mana yang akan kita gunakan untuk mengisi data dinamis di template. Kita bisa menyebutkan dengan cara seperti ini {{.NamaField}}
  • Go-Lang template mendukung perintah action, seperti percabangan, perulangan dan lain-lain. IF Else {{if .Value}} T1 {{end}}, jika Value tidak kosong, maka T1 akan dieksekusi, jika kosong, tidak ada yang dieksekusi. {{if .Value}} T1 {{else}} T2 {{end}}, jika value tidak kosong, maka T1 akan dieksekusi, jika kosong, T2 yang akan dieksekusi. {{if .Value1}} T1 {{else if .Value2}} T2 {{else}} T3 {{end}}, jika Value1 tidak kosong, maka T1 akan dieksekusi, jika Value2 tidak kosong, maka T2 akan dieksekusi, jika tidak semuanya, maka T3 akan dieksekusi
  • Pada golang template juga mendukung operator perbandingan, seperti eq untuk ==, ne untuk !=, lt untuk <, le untuk <=, gt untuk >, dan ge untuk >=
  • Range digunakan untuk melakukan iterasi data table perintah penggunaan range adalah sebagai berikut {{range $index, $element := .Value}} T1 {{else}} T2 {{end}} . Kadang kita sering membuat nested struct, di template terdapat action with, yang bisa digunakan mengubah scope dot menjadi object yang kita mau. Berikut adalah perintah with {{with.Value}}T1{{else}}T2{{end}}
  • Saat kita membuat halaman website, kadang ada beberapa bagian yang selalu sama, misal header dan footer, Best practice nya jika terdapat bagian yang selalu sama, disarankan untuk disimpan pada template yang terpisah, agar bisa digunakan di template lain. Go-Lang template mendukung import dari template lain. Untuk melakukan import, kita bisa menggunakan perintah berikut {{template “nama”}}, artinya kita akan meng-import template “nama” tanpa memberikan data apapun. {{template “nama” .Value}}, artinya kita akan meng-import template “nama” dengan memberikann data value
  • Selain mengakses field, dalam template, function juga bisa diakses. Cara mengakses function sama seperti mengakses field, namun jika function tersebut memiliki parameter, kita bisa gunakan tambahkan parameter ketika memanggil function di template nya. {{.FunctionName}}, memanggil field FunctionName atau function FunctionName() {{.FunctionName “ravi”, "mukti"}}, memanggil function FunctionName(“ravi”, "mukti")
  • Kode-kode diatas yang sudah kita praktekan sebenarnya tidak efisien. Hal ini dikarenakan, setiap Handler dipanggil, kita selalu melakukan parsing ulang template nya. Idealnya template hanya melakukan parsing satu kali diawal ketika aplikasinya berjalan. Selanjutnya data template akan di caching (disimpan di memory), sehingga kita tidak perlu melakukan parsing lagi. Hal ini akan membuat web kita semakin cepat
  • XSS adalah salah satu security issue yang biasa terjadi ketika membuat web. XSS adalah celah keamanan, dimana orang bisa secara sengaja memasukkan parameter yang mengandung JavaScript agar dirender oleh halaman website kita. Biasanya tujuan dari XSS adalah mencuri cookie browser pengguna yang sedang mengakses website kita. XSS bisa menyebabkan account pengguna kita diambil alih jika tidak ditangani dengan baik. Berbeda dengan bahasa pemrograman seperti PHP, di Golang mempunyai fitur bawaan bernama Golang Template Auto Escape, dimana dia bisa mendeteksi data yang perlu ditampilkan di template, jika mengandung tag-tag html atau script, secara otomatis akan di escape. Auto Escape hanya berlaku bagi Template HTML, tidak berlaku bagi Template Text
  • Saat kita membuat website, kadang kita butuh melakukan redirect. Misal setelah selesai login, kita lakukan redirect ke halaman dashboard. Redirect sendiri sebenarnya sudah standard di HTTP. Kita hanya perlu membuat response code 3xx dan menambah header Location. Namun untungnya di Go-Lang, ada function yang bisa kita gunakan untuk mempermudah ini. Kita tinggal menggunakan perintah http.Redirect
  • Saat membuat web, selain menerima input data berupa form dan query param, kadang kita juga menerima input data berupa file dari client. Go-Lang Web sudah memiliki fitur untuk management upload file. Hal ini memudahkan kita ketika butuh membuat web yang menerima input file upload. Saat kita ingin menerima upload file, kita perlu melakukan parsing terlebih dahulu menggunakan Request.ParseMultipartForm(size), atau kita bisa langsung ambil data file nya menggunakan Request.FormFile(name), di dalam nya secara otomatis melakukan parsing terlebih dahulu. Hasilnya merupakan data-data yang terdapat pada package multipart, seperti multipart.File sebagai representasi file nya, dan multipart.FileHeader sebagai informasi file nya
  • Selain upload file, kadang kita ingin membuat halaman website yang digunakan untuk download sesuatu. Sebenarnya di Go-Lang sudah disediakan menggunakan FileServer dan ServeFile. Dan jika kita ingin memaksa file di download (tanpa di render oleh browser, kita bisa menggunakan header Content-Disposition)
  • Dalam pembuatan web, ada konsep yang bernama middleware atau filter atau interceptor. Middleware adalah sebuah fitur dimana kita bisa menambahkan kode sebelum dan setelah sebuah handler di eksekusi. Sayangnya, di Go-Lang web tidak ada middleware. Namun karena struktur handler yang baik menggunakan interface, kita bisa membuat middleware sendiri menggunakan handler. Kadang middleware juga biasa digunakan untuk melakukan error handler. Hal ini sehingga jika terjadi panic di Handler, kita bisa melakukan recover di middleware, dan mengubah panic tersebut menjadi error response. Dengan ini, kita bisa menjaga aplikasi kita tidak berhenti berjalan
  • Walaupun Go-Lang sudah menyediakan ServeMux sebagai handler yang bisa menghandle beberapa endpoint atau istilahnya adalah routing. Tapi kebanyakan programmer Go-Lang biasanya akan menggunakan library untuk melakukan routing. Hal ini dikarenakan ServeMux tidak memiliki advanced fitur seperti path variable, auto binding parameter dan middleware. Banyak alternatif lain yang bisa kita gunakan untuk library routing selain ServeMux. Contohnya library seperti Golang HttpRouter, Gorilla Mux, Beego dll.

About

Training Golang Web dari ProgrammerZamanNow


Languages

Language:Go 98.2%Language:HTML 1.6%Language:CSS 0.1%Language:JavaScript 0.1%