HTTP เซิร์ฟเวอร์

เกี่ยวกับบทเรียน

จากบทเรียนตัวอย่างคุณจะได้เรียนรู้การสร้าง HTTP server ขั้นพื้นฐานด้วยภาษา Go อย่างแรกเลย เรามาดูกันดีกว่าว่า HTTP server ที่เราจะสร้าง มันควรที่จะทำอะไรได้บ้าง โดยพื้นฐานแล้ว HTTP server มีหน้าที่หลักๆ ดังต่อไปนี้

ประมวลผลรีเควสต์ที่ถูกส่งมา

net/http แพ็กเกจ ประกอบไปด้วยตัวช่วยที่จำเป็นทั้งหมดสำหรับรองรับรีเควสต์ที่เข้ามา เราจะสามารถจัดการกับมันได้แบบไดนามิก เราสามารถสร้าง handler ได้ด้วย http.HandleFunc ฟังก์ชัน ตัวแปรแรกทำการรับ path สำหรับจับคู่เส้นทาง และตัวแปรตัวที่สองรับฟังก์ชันที่ใช้สำหรับจัดการสิ่งต่างๆ จากตัวอย่างด้านล่าง เมื่อผู้ใช้งานเรียกหน้าเว็บผ่านเบราว์เซอร์เพื่อเข้าสู่เว็บไซต์ของคุณ (http://example.com/) และพวกเขาจะเห็นกับข้อความต้อนรับที่อบอุ่น

http.HandleFunc("/", func (w http.ResponseWriter, r *http.Request) {
	fmt.Fprint(w, "Welcome to my website!")
})

สำหรับการรับค่าแบบไดนามิกที่พูดถึงก่อนหน้านี้จะเห็นภาพได้ชัดขึ้นเมื่ออ่านย่อหน้านี้จบ http.Request จะประกอบไปด้วยข้อมูลทั้งหมดเกี่ยวกับรีเควสต์ที่ถูกส่งเข้ามารวมถึงตัวแปรอื่นๆ เราสามารถอ่านค่าตัวแปร GET ได้ด้วย r.URL.Query().Get("token") หรือค่าตัวแปร POST (ค่าที่ถูกส่งมาจาก HTML ฟอร์ม) ได้ด้วย r.FormValue("email")

เสิร์ฟสแตติกไฟล์

การเสิร์ฟ JavaScript, CSS หรือไฟล์รูปภาพ เราสามารถเรียกใช้บิวท์อินฟังก์ชัน http.FileServer เพื่อระบุ url ที่เราเก็บไฟล์ต่างๆเอาไว้ สำหรับการที่เราจะทำให้ไฟล์เซิร์ฟเวอร์ทำงานได้อย่างถูกต้องเราจำเป็นต้องรู้ว่าไฟล์ที่เราจะเสิร์ฟมาจากไหน เราสามารถทำได้โดย

fs := http.FileServer(http.Dir("static/"))

เมื่อเรามีไฟล์ที่เราต้องการจะเสิร์ฟอยู่ในโฟลเดอร์ที่เราเตรียมเอาไว้เรียบร้อยแล้ว สิ่งที่เราต้องทำในขั้นต่อไปก็เพียงแค่ระบุที่ที่มันอยู่ วิธีการก็เหมือนกับตอนที่เรารับรีเควสต์แบบไดนามิกก่อนหน้านี้ ส่ิงหนึ่งที่ควรระวังคือ ในการที่เราจะเสิร์ฟไฟล์ได้อย่างถูกต้อง เราต้องเอาชื่อที่อยู่ของ url ที่ได้ระบุเอาไว้ออกไปซะ เพราะโดยปรกติแล้วมันเป็นชื่อของไดเรกทอรีที่เราเก็บไฟล์เหล่านั้นเอาไว้

http.Handle("/static/", http.StripPrefix("/static/", fs))

รอรับการเชื่อมต่อ

ส่ิงสุดท้ายที่จำเป็นที่จะทำให้ HTTP server พื้นฐานของเราเสร็จสมบูรณ์ได้ ก็คือการรับรีเควสต์ที่เข้ามาจากพอร์ตที่เราได้กำหนดไว้จากอินเทอร์เน็ต คุณเดาไว้ไม่ผิดหรอกครับ ภาษา Go มี HTTP server บิวท์อินฟังก์ชันเพื่อช่วยในเรื่องนี้อีกแล้วครับท่าน เรามาเริ่มกันอย่างรวดเร็วกันเลยดีกว่าครับ จากนั้นเราก็ที่จะสามารถดูเว็บไซต์ของเราได้ผ่านทาง เบราว์เซอร์

http.ListenAndServe(":80", nil)

โค้ด (สำหรับทดสอบ copy/paste)

นี่เป็นตัวโค้ดที่เสร็จสมบูรณ์ ซึ่งคุณสามารถนำไปใช้ทดสอบได้ เป็นโค้ดที่คุณได้เรียนรู้มาทั้งหมดในบทเรียนบทนี้

package main

import (
	"fmt"
	"net/http"
)

func main() {
	http.HandleFunc("/", func (w http.ResponseWriter, r *http.Request) {
		fmt.Fprintf(w, "Welcome to my website!")
	})

	fs := http.FileServer(http.Dir("static/"))
	http.Handle("/static/", http.StripPrefix("/static/", fs))

	http.ListenAndServe(":80", nil)
}