Chitsanzo chinagwiritsa ntchito phukusi net/http, ndiye chida chachikulu mu Go popanga ma seva ndi makasitomala a HTTP. Kuti timvetse code, tiyeni timvetse tanthauzo la zinthu zitatu zofunika: http.Handler, http.ServeMux ndi http.Server.
Othandizira HTTP
Tikalandira pempho, wothandizira amasanthula ndikuyankha. Ma Handlers mu Go amakhazikitsidwa motere:
type Handler interface {
ServeHTTP(ResponseWriter, *Request)
}
Chitsanzo choyamba chimagwiritsa ntchito http.HandleFunc wothandizira ntchito. Ikukulunga ntchito ina, yomwe imatenga http.ResponseWriter ndi http.Request mu ServeHTTP.
Mwa kuyankhula kwina, ogwira ntchito ku Golang amawonetsedwa mu mawonekedwe amodzi, omwe amapereka zosankha zambiri kwa wopanga mapulogalamu. Kotero, mwachitsanzo, middleware ikugwiritsidwa ntchito pogwiritsa ntchito chothandizira, kumene ServeHTTP poyamba imachita chinachake ndiyeno imayitana njira ya ServeHTTP ya wothandizira wina.
Monga tafotokozera pamwambapa, othandizira amangoyankha zopempha. Koma ndi chogwirizira chiti chomwe chiyenera kugwiritsidwa ntchito panthawi inayake?
Pemphani Njira
Kuti mupange chisankho choyenera, gwiritsani ntchito HTTP multiplexer. M'malaibulale angapo amatchedwa muxer kapena rauta, koma zonse ndi zofanana. Ntchito ya multiplexer ndikusanthula njira yopempha ndikusankha chogwirizira choyenera.
Njira yosavuta yosinthira ndiyo kugwiritsa ntchito njira ya autocert.NewListener kuphatikiza ndi http.Serve. Njirayi imakupatsani mwayi wopeza ndikusintha ziphaso za TLS pomwe seva ya HTTP ikufuna:
Iyi ndi njira yosavuta yopezera chithandizo chonse cha HTTPS ndikukonzanso satifiketi yokha.
Kuwonjeza njira zokhazikika
Router yokhazikika yophatikizidwa mulaibulale yokhazikika ndiyabwino, koma ndiyofunikira kwambiri. Mapulogalamu ambiri amafunikira njira zovuta kwambiri, kuphatikiza njira zachisawa ndi zakutchire, kapena njira yokhazikitsira njira ndi magawo.
Pankhaniyi ndi bwino kugwiritsa ntchito phukusi gorila/mux ΠΈ go-chi/chi. Tidzaphunzira momwe tingagwiritsire ntchito ndi omaliza - chitsanzo chikuwonetsedwa pansipa.
Fayiloyo ndi api/v1/api.go yomwe ili ndi njira za API yathu:
/ HelloResponse is the JSON representation for a customized message
type HelloResponse struct {
Message string `json:"message"`
}
// HelloName returns a personalized JSON message
func HelloName(w http.ResponseWriter, r *http.Request) {
name := chi.URLParam(r, "name")
response := HelloResponse{
Message: fmt.Sprintf("Hello %s!", name),
}
jsonResponse(w, response, http.StatusOK)
}
// NewRouter returns an HTTP handler that implements the routes for the API
func NewRouter() http.Handler {
r := chi.NewRouter()
r.Get("/{name}", HelloName)
return r
}
Titha kuyika izi ku rauta yathu yayikulu pansi pa api/v1/ prefix mmbuyo mu pulogalamu yathu yayikulu:
// NewRouter returns a new HTTP handler that implements the main server routes
func NewRouter() http.Handler {
router := chi.NewRouter()
router.Mount("/api/v1/", v1.NewRouter())
return router
}
http.Serve(autocert.NewListener("example.com"), NewRouter())
Kusavuta kwa Go pogwira ntchito ndi misewu yovuta kumapangitsa kuti zikhale zotheka kukonza ndi kukonza mapulogalamu akulu, ovuta.
Kugwira ntchito ndi middleware
Kuyika kumaphatikizapo kukulunga chogwirira chimodzi cha HTTP ndi china, kupangitsa kuti zitheke kutsimikizira, kukakamiza, kudula mitengo, ndi ntchito zina zingapo.
func RequireAuthentication(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if !isAuthenticated(r) {
http.Redirect(w, r, "/login", http.StatusTemporaryRedirect)
return
}
// Assuming authentication passed, run the original handler
next.ServeHTTP(w, r)
})
}
Pali ma routers a chipani chachitatu, monga chi, omwe amakulolani kuti muwonjezere magwiridwe antchito apakati.
Kugwira ntchito ndi static mafayilo
Laibulale yokhazikika ya Go imaphatikizapo kuthekera kogwira ntchito ndi zinthu zokhazikika, kuphatikiza zithunzi, mafayilo a JavaScript ndi CSS. Atha kupezeka kudzera mu ntchito ya http.FileServer. Imabwezera chothandizira chomwe chimatumizira mafayilo kuchokera ku bukhu linalake.
Go ilinso ndi gawo lotchedwa kutseka kwabwino kwa seva ya HTTP. Izi zitha kuchitika pogwiritsa ntchito njira ya Shutdown(). Seva imayambika mu goroutine, ndiyeno njira imamvetsedwa kuti ilandire chizindikiro chosokoneza. Chizindikirocho chikangolandiridwa, seva imazimitsa, koma osati nthawi yomweyo, koma patatha masekondi angapo.
handler := server.NewRouter()
srv := &http.Server{
Handler: handler,
}
go func() {
srv.Serve(autocert.NewListener(domains...))
}()
// Wait for an interrupt
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt)
<-c
// Attempt a graceful shutdown
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
srv.Shutdown(ctx)
Monga chomaliza
Go ndi chilankhulo champhamvu chokhala ndi laibulale yodziwika bwino kwambiri. Kuthekera kwake kosasinthika ndikwambiri, ndipo kumatha kukulitsidwa pogwiritsa ntchito zolumikizira - izi zimakupatsani mwayi wopanga ma seva odalirika a HTTP.