Treci la conținutul principal

Cod în jurul fiecărui handler

Middleware este cod care rulează în jurul handlerelor tale: înainte ca cererea să ajungă la ele, după ce răspunsul pleacă de la ele sau în locul lor. Jurnalizare, autentificare, limitarea numărului de cereri, comprimare — toate sunt middleware.

Aceeași idee circulă sub trei nume: framework-urile web spun middleware, gRPC spune interceptor, iar unele ecosisteme spun filtru. Un singur concept, trei vocabulare.

În Go, un middleware este o funcție care primește un handler și returnează un handler împachetat — exact șablonul Decorator din grupul șabloanelor de proiectare, iar o stivă de astfel de funcții se comportă ca un Chain of Responsibility.


Un middleware de jurnalizare

withLog împachetează orice handler: afișează cererea care intră, lasă handlerul să lucreze și afișează din nou la ieșire. Handlerul în sine rămâne complet neștiutor.

Împachetezi o dată, jurnalizezi tot

Handlerul împachetat servește două căi diferite și ambele sunt jurnalizate — jurnalizarea este scrisă o singură dată, în împachetare, nu în fiecare handler.

Prompt
Scrie un program Go cu un middleware withLog care împachetează un http.Handler, afișând o linie cu o săgeată, metoda și calea înainte de a apela handlerul următor și o linie de finalizare după. Împachetează un mux cu două rute, servește cu httptest, cere ambele căi și afișează răspunsurile.
Ieșire: program Go și rezultatul capturat
Wrap once, log everything

Middleware care oprește cererea

Un middleware poate și să refuze: o verificare de autentificare care nu găsește o cheie validă scrie 401 Unauthorized și nu apelează niciodată handlerul următor.

Înlănțuite ca withLog(withAuth(handler)), cererea trece prin straturi în ordine — iar răspunsul iese înapoi prin ele.

Un strat de autentificare în lanț

Cererea fără cheie este oprită de stratul de autentificare cu 401 — handlerul nu rulează niciodată. Cu cheie, cererea trece prin tot lanțul și ajunge la date.

Prompt
Scrie un program Go cu două middleware-uri înlănțuite: withLog care afișează cererea și withAuth care verifică antetul X-API-Key și răspunde cu 401 fără a apela handlerul următor atunci când cheia este greșită. Împachetează un handler de date ca withLog(withAuth(handler)), servește cu httptest, apoi trimite o cerere fără cheie și una cu cheie, afișând ambele statusuri și corpuri.
Ieșire: program Go și rezultatul capturat