การสร้างเซิร์ฟเวอร์ HTTP
ListenAndServe, HandlerFunc และ ServeMux
การสร้างเซิร์ฟเวอร์ HTTP เป็นบทเรียน Go Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Go Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน
แพ็กเกจ net/http
ไลบรารีมาตรฐานของ Go อย่าง net/http มีเซิร์ฟเวอร์ HTTP/1.1 และ HTTP/2 ที่พร้อมใช้งานจริงโดยไม่ต้องพึ่งพาส่วนประกอบภายนอก
เซิร์ฟเวอร์พื้นฐาน
ลงทะเบียนตัวจัดการด้วย http.HandleFunc และเริ่มรับการเชื่อมต่อด้วย http.ListenAndServe:
http.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Hello, World!")
})
log.Fatal(http.ListenAndServe(":8080", nil))อินเทอร์เฟซ http.Handler
ชนิดข้อมูลใดก็ตามที่ใช้งาน ServeHTTP(ResponseWriter, *Request) จะเป็น http.Handler ใช้รูปแบบนี้กับตัวจัดการที่มีสถานะและเก็บฐานข้อมูลหรือการกำหนดค่าไว้ภายใน
type App struct{ db *sql.DB }
func (a *App) ServeHTTP(w http.ResponseWriter, r *http.Request) {
// use a.db
}ServeMux
http.NewServeMux() สร้างเราเตอร์แยกอิสระ ให้ส่งเราเตอร์นี้ไปยัง http.ListenAndServe เพื่อหลีกเลี่ยง mux เริ่มต้นส่วนกลาง ซึ่งปลอดภัยกว่าสำหรับไลบรารี
mux := http.NewServeMux()
mux.HandleFunc("/api/users", usersHandler)
http.ListenAndServe(":8080", mux)การตอบกลับด้วยรหัสสถานะ
เขียนรหัสสถานะด้วย w.WriteHeader(code) ก่อนเขียนเนื้อหาการตอบกลับ หากเรียก w.Write เพียงอย่างเดียว รหัสสถานะจะมีค่าเริ่มต้นเป็น 200
w.WriteHeader(http.StatusCreated)
w.Write([]byte("created"))การเขียนการตอบกลับ JSON
กำหนด Content-Type ก่อนเขียนเนื้อหาการตอบกลับ จากนั้นเข้ารหัสด้วย json.Encoder:
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(data)การอ่านคำขอ
เข้าถึงวิธีการ, URL, ส่วนหัว, พารามิเตอร์การค้นหา และเนื้อหาคำขอผ่านโครงสร้าง *Request
r.Method // "GET", "POST", ...
r.URL.Path // "/api/users"
r.URL.Query().Get("id") // query param
r.Header.Get("Authorization")การแยกวิเคราะห์เนื้อหาคำขอ JSON
ถอดรหัสเนื้อหาคำขอด้วย json.Decoder จำกัดขนาดเนื้อหาด้วย http.MaxBytesReader เพื่อป้องกันหน่วยความจำไม่เพียงพอ
r.Body = http.MaxBytesReader(w, r.Body, 1<<20)
var req CreateUserRequest
json.NewDecoder(r.Body).Decode(&req)การกำหนดค่าเซิร์ฟเวอร์
กำหนดเวลาหมดด้วย http.Server แบบกำหนดเอง เพื่อป้องกันการโจมตีจากไคลเอ็นต์ที่ทำงานช้า:
srv := &http.Server{
Addr: ":8080",
Handler: mux,
ReadTimeout: 5 * time.Second,
WriteTimeout: 10 * time.Second,
IdleTimeout: 120 * time.Second,
}
srv.ListenAndServe()HTTPS
ใช้ srv.ListenAndServeTLS(certFile, keyFile) เพื่อให้บริการ HTTPS ใบรับรองอาจเป็นใบรับรองที่ลงนามด้วยตนเองสำหรับการพัฒนา หรือมาจาก Let's Encrypt สำหรับระบบจริงผ่าน golang.org/x/crypto/acme/autocert
การประกอบตัวจัดการ
ห่อตัวจัดการเพื่อเพิ่มข้อกังวลร่วม เช่น การบันทึกเหตุการณ์, Auth และ Recovery โดยไม่แก้ไขตรรกะทางธุรกิจ หลังปรับแต่งแล้วให้ส่งคืนตัวจัดการถัดไป
ตรวจสอบความเข้าใจ
เหตุใดจึงควรกำหนด ReadTimeout และ WriteTimeout บน http.Server
ทบทวน: การสร้างเซิร์ฟเวอร์ HTTP
ประเด็นสำคัญ:
- ใช้ HandleFunc + ListenAndServe สำหรับเซิร์ฟเวอร์อย่างง่าย
- ใช้ http.Server แบบกำหนดเองพร้อมเวลาหมดสำหรับระบบจริง
- ใช้ ServeMux เพื่อแยกการกำหนดเส้นทาง
- ใช้ json.NewEncoder(w) สำหรับการตอบกลับ JSON
คำถามที่พบบ่อย
บทเรียน “การสร้างเซิร์ฟเวอร์ HTTP” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การสร้างเซิร์ฟเวอร์ HTTP” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Go Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การสร้างเซิร์ฟเวอร์ HTTP”
ListenAndServe, HandlerFunc และ ServeMux คุณปฏิบัติ Go Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Go Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Go Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “การสร้างเซิร์ฟเวอร์ HTTP” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Go Academy นี้ได้ไหม
ได้ บทเรียน Go Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การสร้างเซิร์ฟเวอร์ HTTP
- การกำหนดเส้นทางและพารามิเตอร์เส้นทาง
- รูปแบบมิดเดิลแวร์
- การปิดระบบอย่างนุ่มนวล