Zpracování POST požadavků a souborů v Go: praktický průvodce pro vývojáře
Druhá část cyklu o net/http je věnována zpracování POST požadavků, nahrávání souborů a vytvoření in-memory úložiště. Tyto dovednosti jsou klíčové pro vývoj bezpečných a výkonných webových služeb v Go.
Základy zpracování POST požadavků
POST požadavky se používají pro vytváření nových zdrojů na serveru. Na rozdíl od GET jsou data přenášena v těle požadavku, což umožňuje odesílat velké množství informací, včetně souborů. Klíčové aspekty zpracování:
- Kontrola HTTP-metody přes r.Method
- Použití konstant net/http pro zlepšení čitelnosti kódu
- Omezení velikosti těla požadavku pro prevenci DoS útoků
- Správné zpracování různých typů kódování dat
Příklad základní kontroly metody:
func CreateHandler(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodPost {
http.Error(w, "Metoda není povolena", http.StatusMethodNotAllowed)
return
}
// Další zpracování
}
Práce s formuláři a daty
Formuláře mohou používat dva hlavní typy kódování: multipart/form-data pro soubory a application/x-www-form-urlencoded pro textová data. Pro parsování multipart formulářů se používá metoda ParseMultipartForm:
err := r.ParseMultipartForm(32 << 20) // Omezení 32 MB
if err != nil {
http.Error(w, "Chyba při parsování formuláře", http.StatusBadRequest)
return
}
Extrahování textových hodnot se provádí přes FormValue nebo PostFormValue:
- r.FormValue("message") — vrací hodnotu pole formuláře
- r.PostFormValue("message") — podobně, ale ignoruje query parametry
Důležité vlastnosti:
- Metody vracejí první hodnotu pro zadaný klíč
- Při prázdném poli se vrací prázdný řetězec
- FormValue funguje s oběma typy kódování
Bezpečné zpracování souborů
Nahrávání souborů vyžaduje zvláštní pozornost k bezpečnosti. Metoda FormFile vrací soubor, jeho hlavičku a případnou chybu:
file, fileHeader, err := r.FormFile("upload")
if err != nil {
http.Error(w, "Chyba při načítání souboru", http.StatusBadRequest)
return
}
defer file.Close()
FileHeader obsahuje metadata souboru:
- Filename — jméno souboru
- Size — deklarovaná velikost
- Header — MIME-typ a další informace
Kritická bezpečnostní opatření:
- Validace MIME-typů
buf := make([]byte, 512)
_, err = file.Read(buf)
if err != nil {
http.Error(w, "Nelze přečíst soubor", http.StatusInternalServerError)
return
}
mimeType := http.DetectContentType(buf)
allowedTypes := []string{"image/jpeg", "image/png", "application/pdf"}
// Kontrola shody s povolenými typy
- Sanace jmen souborů
safeFileName := filepath.Base(fileHeader.Filename)
// Zabrání path traversal útokům
- Omezení velikosti souborů
r.Body = http.MaxBytesReader(w, r.Body, 10<<20) // 10 MB
Vytvoření in-memory úložiště
In-memory úložiště zajišťuje rychlý přístup k datům, ale vyžaduje správu paměti a zajištění bezpečnosti vláken. Základní implementace zahrnuje:
- Použití sync.Map pro konkurentní přístup
- Implementace TTL (Time To Live) pro automatické odstranění zastaralých dat
- Hashování citlivých informací
Příklad struktury úložiště:
type Storage struct {
data sync.Map
mu sync.RWMutex
}
func (s *Storage) Set(key string, value interface{}, ttl time.Duration) {
s.mu.Lock()
defer s.mu.Unlock()
s.data.Store(key, value)
// Nastavení časovače pro odstranění po vypršení TTL
}
Klíčové výhody in-memory přístupu:
- Extrémně vysoká rychlost přístupu
- Jednoduchost implementace a ladění
- Ideální pro dočasná data a ukládání do mezipaměti
Omezení:
- Data se ztrácejí při restartování aplikace
- Omezeno dostupnou operační pamětí
- Vyžaduje implementaci mechanismů čištění
Optimalizace výkonu
Pro zajištění stabilního provozu pod zátěží je nutné:
- Nastavit rozumné limity na velikost požadavků a souborů
- Používat pool bufferů pro práci se soubory
- Implementovat graceful shutdown pro uchování dat
- Monitorovat využití paměti a včasně čistit mezipaměť
Příklad nastavení limitů:
server := &http.Server{
Addr: ":8080",
ReadTimeout: 10 * time.Second,
WriteTimeout: 10 * time.Second,
MaxHeaderBytes: 1 << 20, // 1 MB
}
Co je důležité
- Vždy kontrolujte HTTP-metodu a vracejte odpovídající stavové kódy chyb
- Omezte velikost požadavků a souborů pro ochranu před DoS útoky
- Validujte MIME-typy nahrávaných souborů
- Používejte sanaci jmen souborů pro zabránění path traversal
- Implementujte mechanismy čištění in-memory úložiště
- Testujte zpracování chyb a okrajové případy
Závěr
Zpracování POST požadavků a souborů je základní dovednost pro vývojáře v Go. Správná implementace těchto mechanismů zajišťuje bezpečnost, výkon a spolehlivost webových služeb. In-memory úložiště doplňuje tento obraz, poskytuje rychlý přístup k dočasným datům. V dalších částech cyklu budou probrány architektonické vzory a mechanismy autentizace.
— Editorial Team
Zatím žádné komentáře.