Skip to main content

Handle HTTP request with Golang

เรามาเริ่มจากการเขียน handle HTTP สัก 1 endpoint ง่าย ๆ กันดีกว่า เพื่อเป็นตัวอย่างก่อนจะเริ่มทำเป็น Hexagonal Architecture

เริ่มด้วยการ init project กันก่อนเลย

  1. สร้าง folder สำหรับ project นี้ก่อน
  2. สร้าง file main.go ขึ้นมา
  3. run command $ go mod init github.com/{github_username}/{repo_name} เพื่อสร้าง file go.mod ที่เป็น list ของ module ที่ใช้ใน project นี้นั่นเอง (package.json ของ Golang, requirement.txt ของ python) 

หลังจากที่สร้าง project ไว้แล้ว เราก็มาเริ่มเขียนส่วน HTTP handler กันเลยดีกว่า

โค้ดด้านล่างนี้จะเป็นการสร้าง instance ของ server รวมถึง config ที่เราอยากจะปรับก็สามารถปรับที่นี่ได้เลย และส่วนที่อยู่ด้านล่างจะเป็นส่วนที่เราสั่งให้โปรแกรมของเรานั้น listen ที่ config ที่เราต้องการ

package main

func main() {
	s := &http.Server{
		Addr:           ":8080",
		ReadTimeout:    10 * time.Second,
		WriteTimeout:   10 * time.Second,
		MaxHeaderBytes: 1 << 20,
	}

	if err := s.ListenAndServe(); err != nil {
		panic(err)
	}
}

หลังจากได้โค้ดด้านบนมาแล้วเราจะมา register endpoint 1 ตัว ซึ่งจะ path อะไรก็ได้ในที่นี้ผมจะใช้ "/" เพื่อให้เข้าใจได้ง่าย

package main

func main() {
	s := &http.Server{
		Addr:           ":8080",
		ReadTimeout:    10 * time.Second,
		WriteTimeout:   10 * time.Second,
		MaxHeaderBytes: 1 << 20,
	}
  
  	http.HandleFunc("/", (func(w http.ResponseWriter, r *http.Request) {
		response_value := map[string]any{"Message": "Hello, World"}
		response, _ := json.Marshal(response_value)
		w.Write(response)
	}))

	if err := s.ListenAndServe(); err != nil {
		panic(err)
	}
}

เราจำเป็นต้อง handle ฟังก์ชันก่อนการเรียกใช้ฟังก์ชัน ListenAndServe() นะครับ

หลังจาก register endpoint ไปแล้วเราลอง run server ของเราโดยการ run command $ go run ./main.go แล้วใช้ software ยิง HTTP request ไปที่ http://localhost:8080/ หรือเข้าผ่านทาง browser ได้เลย เพราะเรารับเป็น request ที่ไม่ได้บังคับว่าต้องเป็น method อะไร ถ้าทุกอย่างถูกต้องก็จะได้ผลลัพธ์ตามด้านล่างนี้เลยครับ

Screenshot 2565-11-01 at 14.36.48.png