HTTP เซิร์ฟเวอร์
เกี่ยวกับบทเรียน
จากบทเรียนตัวอย่างคุณจะได้เรียนรู้การสร้าง HTTP server ขั้นพื้นฐานด้วยภาษา Go อย่างแรกเลย เรามาดูกันดีกว่าว่า HTTP server ที่เราจะสร้าง มันควรที่จะทำอะไรได้บ้าง โดยพื้นฐานแล้ว HTTP server มีหน้าที่หลักๆ ดังต่อไปนี้
- ประมวลผลรีเควสต์ที่ถูกส่งมา: คือการประมวลผลจาก รีเควสต์ที่ถูกส่งมาจากผู้ใช้งานที่เรียกมาจากเบราว์เซอร์ เมื่อพวกเขาทำการเปิดดูเว็บไซต์ ไม่ว่าจะเป็นการล็อกอินเข้าสู่ระบบ หรือการโพสต์รูปภาพเป็นต้น
- เสิร์ฟสแตติกไฟล์: ไม่ว่าจะเป็นการเสิร์ฟ JavaScript, CSS หรือไฟล์รูปภาพไปยังเบราว์เซอร์ เพื่อการสร้างประสบการณ์การรับรู้แบบไดนามิกให้กับผู้ใช้งานของเรา
- รอรับการเชื่อมต่อ: 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)
}