0Pricing
Go Academy · บทเรียน

การสร้างเซิร์ฟเวอร์ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การสร้างเซิร์ฟเวอร์ HTTP
  2. การกำหนดเส้นทางและพารามิเตอร์เส้นทาง
  3. รูปแบบมิดเดิลแวร์
  4. การปิดระบบอย่างนุ่มนวล
← กลับไปที่ Go Academy