முக்கிய உள்ளடக்கத்திற்குச் செல்லவும்
தொகுதி 10 · பாடம் 5 இன் 5பாடத்திட்டத்தில் 50/50~18 min
தொகுதி பாடங்கள் (5/5)

சிறு திட்டம்: ஒரு HTTP சர்வர்

net/http stdlib தொகுப்பு உற்பத்திக்கு தயாராக இருக்கும் HTTP சேவையகத்தை உருவாக்க போதுமானது: ரூட்டிங், ஹேண்ட்லர்கள், மிடில்வேர், அழகான பணிநிறுத்தம். கட்டமைப்பு தேவையில்லை. வழக்கமான REST APIகளுக்கு இதுவே அடித்தளம்.

வணக்கம் உலகம்

Go
package main

import (
    "fmt"
    "net/http"
)

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "hello %s", r.URL.Path[1:])
    })
    if err := http.ListenAndServe(":8080", nil); err != nil {
        panic(err)
    }
}

http.ListenAndServe தடுக்கிறது மற்றும் பிழையில் மட்டுமே திரும்பும். nil இரண்டாவது வாதமாக = "DefaultServeMux ஐப் பயன்படுத்தவும்".

கையாளுபவர் கையொப்பம்

அனைத்து கையாளுபவர்களும் ஒரே கையொப்பத்தைப் பகிர்ந்து கொள்கிறார்கள்:

Go
func(w http.ResponseWriter, r *http.Request)
  • w http.ResponseWriter — வெளியீடு: தலைப்புகள், நிலைக் குறியீடு, உடல்.
  • r *http.Request — உள்ளீடு: முறை, URL, தலைப்புகள், உடல், சூழல்.

வழக்கமான முறை:

Go
func ping(w http.ResponseWriter, r *http.Request) {
    if r.Method != http.MethodGet {
        http.Error(w, "method not allowed", http.StatusMethodNotAllowed)
        return
    }
    w.Header().Set("Content-Type", "application/json")
    w.WriteHeader(http.StatusOK) // optional, defaults to 200
    fmt.Fprintln(w, `{"ok":true}`)
}

ServeMux மூலம் ரூட்டிங்

*http.ServeMux அடிப்படை திசைவி. Go 1.22 என்பதால் இது முறை மற்றும் பாதை அளவுருக்கள் கொண்ட வடிவங்களை ஆதரிக்கிறது:

Go
mux := http.NewServeMux()
mux.HandleFunc("GET /users/{id}", func(w http.ResponseWriter, r *http.Request) {
    id := r.PathValue("id")
    fmt.Fprintln(w, "user", id)
})
mux.HandleFunc("POST /users", createUser)

http.ListenAndServe(":8080", mux)

மேலும் அதிநவீன ரவுட்டர்களுக்கு (குழுக்கள், ஒருங்கிணைந்த மிடில்வேர், ரீஜெக்ஸ்) chi, gorilla/mux, gin, echo உள்ளது. 90% வழக்குகளை stdlib உள்ளடக்கியது.

ஒரு அலங்கரிப்பாளராக மிடில்வேர்

மிடில்வேர் என்பது ஒரு செயல்பாடு func(http.Handler) http.Handler:

Go
func logMW(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        start := time.Now()
        next.ServeHTTP(w, r)
        log.Printf("%s %s %s", r.Method, r.URL.Path, time.Since(start))
    })
}

http.ListenAndServe(":8080", logMW(mux))

அவர்களை இணைக்க: logMW(authMW(rateLimitMW(mux))). ஒவ்வொரு மிடில்வேர் அடுத்ததை அலங்கரிக்கிறது.

சிறந்த கட்டுப்பாட்டிற்கு http.Server

http.ListenAndServe(addr, h) ஒரு குறுக்குவழி. காலக்கெடு, TLS மற்றும் அழகான பணிநிறுத்தம் ஆகியவற்றிற்கு நீங்கள் http.Server ஐ உடனடியாகச் செய்ய வேண்டும்:

Go
srv := &http.Server{
    Addr:              ":8080",
    Handler:           mux,
    ReadHeaderTimeout: 5 * time.Second,
    ReadTimeout:       30 * time.Second,
    WriteTimeout:      30 * time.Second,
    IdleTimeout:       2 * time.Minute,
}
log.Fatal(srv.ListenAndServe())

சூழலுடன் அழகான பணிநிறுத்தம்

செயல்முறை SIGINT/SIGTERM ஐப் பெறும்போது, ​​மூடுவதற்கு முன் விமானத்தில் உள்ள கோரிக்கைகளை முடிக்க வேண்டும்:

Go
ctx, stop := signal.NotifyContext(context.Background(),
    os.Interrupt, syscall.SIGTERM)
defer stop()

srv := &http.Server{Addr: ":8080", Handler: mux}
go func() {
    if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
        log.Fatal(err)
    }
}()

<-ctx.Done() // wait for the signal

shutdownCtx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
if err := srv.Shutdown(shutdownCtx); err != nil {
    log.Println("shutdown:", err)
}

srv.Shutdown புதிய இணைப்புகளை ஏற்றுக்கொள்வதை நிறுத்தி, செயலில் உள்ளவை முடிவடையும் வரை காத்திருக்கிறது (கடந்த காலக்கெடு வரை).

JSON உடலைப் படித்தல்

Go
type CreateUserReq struct {
    Name string `json:"name"`
}

func createUser(w http.ResponseWriter, r *http.Request) {
    var req CreateUserReq
    if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
        http.Error(w, err.Error(), http.StatusBadRequest)
        return
    }
    // ... use req.Name
    w.WriteHeader(http.StatusCreated)
}

r.Body என்பது io.ReadCloser: சேவையகம் தானாக அதை மூடுகிறது, ஆனால் json.NewDecoder முதல் JSON பொருளைக் கடந்ததைப் படிக்கவில்லை (உள்ளீட்டைச் சரிபார்ப்பதற்குப் பயன்படும்).

பயிற்சிகள்

உடற்பயிற்சி#go.m10.l5.e1
முயற்சிகள்: 0ஏற்றுகிறது…

ரெஜிஸ்ட்ரா எல்'ஹேண்ட்லர் ஹலோ சுல்லா ரூட் '/' usando http.HandleFunc.

எடிட்டரை ஏற்றுகிறது…

3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்

உடற்பயிற்சி#go.m10.l5.e2
முயற்சிகள்: 0ஏற்றுகிறது…

Avvia il server su :8080 con http.ListenAndServe e Stampa l'errore se non è nil.

எடிட்டரை ஏற்றுகிறது…

3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்

Quiz#go.m10.l5.e3
தயார்

கோவில் HTTP ஹேண்ட்லர் என்ன?

Go
func H(???) { ... }
பதில் விருப்பங்கள்