Table of Contents

01 – Web Server & Route

Web Server

Go menyediakan package net/http, berisi berbagai macam fitur untuk keperluan pembuatan aplikasi berbasis web. Termasuk di dalamnya web server, routing, templating, dan lainnya.

Go memiliki web server sendiri, dan web server tersebut berada di dalam Go, tidak seperti bahasa lain yang servernya terpisah dan perlu diinstal sendiri (seperti PHP yang memerlukan Apache, .NET yang memerlukan IIS).

Pada chapter ini kita akan belajar cara pembuatan aplikasi web sederhana dan pemanfaatan template untuk mendesain view.

Membuat Aplikasi Web Sederhana

Pertama buat folder project baru dengan isi main.go, tentukan package-nya sebagai main, lalu import package fmt dan net/http.

				
					package main

import "fmt"
import "net/http"

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintln(w, "Hello World")
    })

    fmt.Println("starting web server at http://localhost:8080/")
    http.ListenAndServe(":8080", nil)
}
				
			
Route

Sekarang kita akan menggunakan beberapa endpoint dengan beberapa route seperti di bawah ini.

				
					package main

import (
	"fmt"
	"net/http"
)

func main() {
	http.HandleFunc("/", handlerIndex)
	http.HandleFunc("/index", handlerIndex)
	http.HandleFunc("/hello", handlerHello)

	var address = "localhost:9000"
	fmt.Printf("server started at %s\n", address)
	err := http.ListenAndServe(address, nil)
	if err != nil {
		fmt.Println(err.Error())
	}
}

func handlerIndex(w http.ResponseWriter, r *http.Request) {
	var message = "Welcome"
	w.Write([]byte(message))
}

func handlerHello(w http.ResponseWriter, r *http.Request) {
	var message = "Hello world!"
	w.Write([]byte(message))
}

				
			
  1. Fungsi http.HandleFunc() digunakan untuk routing. Parameter pertama adalah rute dan parameter ke-2 adalah handler-nya.
  2. Handler yang dipanggil memiliki dua buah fungsi, masing-masing fungsi memiliki skema parameter yang sama seperti berikut.
    • Parameter ke-1 bertipe http.ResponseWrite
    • Parameter ke-2 bertipe *http.Request
  3. Method Write() milik parameter pertama (yang bertipe http.ResponseWrite), digunakan untuk meng-output-kan nilai balik data. Argumen method adalah data yang ingin dijadikan output, ditulis dalam bentuk []byte.
  4. Pada contoh ini, data yang akan kita tampilkan bertipe string, maka perlu dilakukan casting dari string ke []byte. Contohnya bisa dilihat seperta pada kode di atas, di bagian w.Write([]byte(message)).
  5. Selanjutnya, siapkan fungsi main() dengan isi di dalamnya adalah beberapa rute atau route, dengan aksi adalah kedua fungsi yang sudah disiapkan di atas. Tak lupa siapkan juga kode untuk start server.
  6. Fungsi http.ListenAndServe() pada main digunakan untuk membuat start server baru, dengan parameter pertama adalah alamat web server yang diiginkan (bisa diisi host, host & port, atau port saja). Parameter kedua merupakan object mux atau multiplexer.

Ok, sekarang program sudah siap, jalankan menggunakan go run

  •  
				
					server started at localhost:9000
				
			
Routing Static Asset

Struktur Direktori :

my-app
 – assets
 – –  default.css
 – go.mod
 – main.go

Bagaimana caranya kita mengakses folder assets. Folder assets merupakan static assets dan syarat yang dibutuhkan untuk routing static assets masih sama dengan routing handler, yaitu perlu didefiniskan rute-nya dan handler-nya. Hanya saja pembedanya, dalam routing static assets yang digunakan adalah http.Handle(), bukan http.HandleFunc().

 

				
					package main

import (
	"fmt"
	"net/http"
)

func main() {
	http.HandleFunc("/", handlerIndex)
	http.HandleFunc("/index", handlerIndex)
	http.HandleFunc("/hello", handlerHello)
	http.Handle("/static/",
		http.StripPrefix("/static/",
			http.FileServer(http.Dir("assets"))))

	var address = "localhost:9000"
	fmt.Printf("server started at %s\n", address)
	err := http.ListenAndServe(address, nil)
	if err != nil {
		fmt.Println(err.Error())
	}
}

func handlerIndex(w http.ResponseWriter, r *http.Request) {
	var message = "Welcome"
	w.Write([]byte(message))
}

func handlerHello(w http.ResponseWriter, r *http.Request) {
	var message = "Hello world!"
	w.Write([]byte(message))
}

				
			
  1. Rute yang dipakai adalah /static/, maka nantinya semua request yang di awali dengan /static/ akan diarahkan ke folder assets. Registrasi rute menggunakan http.Handle() berbeda dengan routing menggunakan http.HandleFunc().

  2. Sedang untuk handler-nya bisa di-lihat, ada pada parameter ke-2 yang isinya statement http.StripPrefix(). Sebenarnya actual handler nya berada pada http.FileServer(). Fungsi http.StripPrefix() hanya digunakan untuk membungkus actual handler.

Fungsi http.FileServer() mengembalikan objek ber-tipe http.Handler. Fungsi ini berguna untuk men-serve semua http request, dengan konten yang didefinisikan pada parameter. Pada konteks ini yang di-maksud adalah http.Dir("assets"). Semua konten, entah file ataupun folder, yang ada di dalam folder assets akan di proses dalam handler.

Jalankan main.go, lalu test hasilnya di browser http://localhost:9000/static/