HTTP Server
#
// `net/http` package ကို သုံးပြီး အခြေခံ HTTP server ရေးရတာ လွယ်ကူပါတယ်။
package main
import (
"fmt"
"net/http"
)
// `net/http` servers မှာ အခြေခံကျတဲ့ သဘောတရားက *handlers* ဖြစ်ပါတယ်။
// handler ဆိုတာ `http.Handler` interface ကို implement လုပ်ထားတဲ့ object တစ်ခုပါ။
// handler ရေးသားရန် ပုံမှန်နည်းလမ်းတစ်ခုက သင့်လျော်တဲ့ signature ရှိတဲ့ function တွေပေါ်မှာ
// `http.HandlerFunc` adapter ကို သုံးခြင်းဖြစ်ပါတယ်။
func hello(w http.ResponseWriter, req *http.Request) {
// Handler အဖြစ် ဆောင်ရွက်တဲ့ function တွေဟာ `http.ResponseWriter` နဲ့
// `http.Request` ကို argument အဖြစ် လက်ခံပါတယ်။ response writer ကို
// HTTP response ဖြည့်စွက်ဖို့ သုံးပါတယ်။ ဒီနေရာမှာ ကျွန်တော်တို့ရဲ့ ရိုးရှင်းတဲ့ response က
// "hello\n" ပဲ ဖြစ်ပါတယ်။
fmt.Fprintf(w, "hello\n")
}
func headers(w http.ResponseWriter, req *http.Request) {
// ဒီ handler က နည်းနည်းပိုပြီး ရှုပ်ထွေးပါတယ်။ HTTP request headers အားလုံးကို
// ဖတ်ပြီး response body ထဲကို ပြန်ထည့်ပေးပါတယ်။
for name, headers := range req.Header {
for _, h := range headers {
fmt.Fprintf(w, "%v: %v\n", name, h)
}
}
}
func main() {
// ကျွန်တော်တို့ရဲ့ handlers တွေကို server routes တွေမှာ မှတ်ပုံတင်ဖို့
// `http.HandleFunc` convenience function ကို သုံးပါတယ်။ ဒီ function က
// `net/http` package ထဲက *default router* ကို set up လုပ်ပြီး
// function တစ်ခုကို argument အဖြစ် လက်ခံပါတယ်။
http.HandleFunc("/hello", hello)
http.HandleFunc("/headers", headers)
// နောက်ဆုံးမှာ၊ port နဲ့ handler ကို `ListenAndServe` နဲ့ ခေါ်ပါတယ်။
// `nil` က default router ကို သုံးမယ်လို့ ပြောတာပါ။
http.ListenAndServe(":8090", nil)
}
# Server ကို နောက်ခံမှာ run ပါ။
$ go run http-servers.go &
# `/hello` route ကို access လုပ်ပါ။
$ curl localhost:8090/hello
hello