Makore mashanu apfuura ndakatanga
Ichi chinyorwa chiri pamusoro pekunyora sevha muGo. Ngatitangei nezvinhu zvakapfava senge "Mhoro nyika!" uye tipedze nechishandiso chine zvinotevera kugona:
-Kushandisa Let's Encrypt yeHTTPS.
-Kushanda se API router.
- Kushanda nepakati.
-Kugadziriswa kwema static mafaera.
- Kudzima chaiko.
Skillbox inokurudzira: Nzira inoshanda
"Python developer kubva pakutanga" .Tinoyeuchidza: kune vese vaverengi veHabr - a 10 ruble mutengo paunenge uchinyoresa mune chero Skillbox kosi uchishandisa iyo Habr promo kodhi.
Mhoro, nyika!
Iwe unogona kugadzira sevha yewebhu muGo nekukurumidza. Heino muenzaniso wekushandisa chibatiso chinodzosera iyo "Mhoro, nyika!" yakavimbiswa pamusoro.
package main
import (
"fmt"
"net/http"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello World!")
})
http.ListenAndServe(":80", nil)
}
Mushure meizvi, kana iwe uchimhanyisa application uye wovhura peji
Tichashandisa mubatiri kakawanda gare gare, asi chekutanga ngatinzwisise kuti zvese zvinoshanda sei.
mambure/http
Muenzaniso wakashandisa package net/http
HTTP vanobata
Kana tagamuchira chikumbiro, mubati anochiongorora uye oburitsa mhinduro. MaHandlers muGo anoitwa sezvinotevera:
type Handler interface {
ServeHTTP(ResponseWriter, *Request)
}
Muenzaniso wekutanga unoshandisa http.HandleFunc mubatsiri basa. Inoputira rimwe basa, iro rinotora http.ResponseWriter uye http.Request kupinda ServeHTTP.
Mune mamwe mazwi, vanobata muGolang vanounzwa mune imwechete interface, iyo inopa yakawanda sarudzo kune programmer. Saka, semuenzaniso, middleware inoshandiswa uchishandisa mubati, uko ServeHTTP inotanga kuita chimwe chinhu uye yobva yadaidza iyo ServeHTTP nzira yeumwe mubati.
Sezvataurwa pamusoro apa, vabati vanongogadzira mhinduro kune zvikumbiro. Asi ndeupi mugadziri anofanirwa kushandiswa pane imwe nguva nenguva?
Kumbira Routing
Kuita sarudzo chaiyo, shandisa HTTP multiplexer. Mumaraibhurari akati wandei inonzi muxer kana router, asi zvese zvakafanana. Basa remultiplexer nderokuongorora nzira yekukumbira uye sarudza mubati akakodzera.
Kana iwe uchida rutsigiro rwekuomarara nzira, saka zviri nani kushandisa yechitatu-bato raibhurari. Dzimwe dzepamusoro-soro -
Kushanda nemafuremu akaoma mumamiriro akajairwa kunoda zvigadziriso zvisina mwero, uye izvi zvinoomesa zvakanyanya kushandiswa kwevabatiri vekutanga. Kugadzira huwandu hukuru hwezvishandiso, musanganiswa weraibhurari yakasarudzika uye iri nyore router ichave yakakwana.
Query Processing
Pamusoro pezvo, isu tinoda chikamu chinozo "teerera" kune chinouya chinongedzo uye kuendesa zvikumbiro zvese kune mubati akakodzera. http.Server inogona kubata basa iri nyore.
Izvi zvinotevera zvinoratidza kuti sevha inobata mabasa ese ane chekuita nekubatanidza kugadzirisa. Izvi, semuenzaniso, zvinoshanda uchishandisa TLS protocol. Kuti uite iyo http.ListenAndServer call, yakajairwa HTTP server inoshandiswa.
Zvino ngatitarisei mimwe mienzaniso yakaoma kunzwisisa.
Kuwedzera Let's Encrypt
Nekumisikidza, yedu application inomhanya pamusoro peHTTP protocol, asi inokurudzirwa kushandisa HTTPS protocol. Izvi zvinogona kuitwa pasina matambudziko muGo. Kana iwe wakagamuchira chitupa uye kiyi yakavanzika, saka zvakakwana kunyoresa ListenAndServeTLS nechitupa chakakodzera uye mafaera akakosha.
http.ListenAndServeTLS(":443", "cert.pem", "key.pem", nil)
Unogona kugara uchiita zvirinani.
autocert
.
Nzira iri nyore yekuigadzirisa ndeye kushandisa autocert.NewListener nzira yakasanganiswa ne http.Serve. Iyo nzira inobvumidza iwe kuwana uye kugadzirisa TLS zvitupa nepo HTTP server ichiita zvikumbiro:
http.Serve(autocert.NewListener("example.com"), nil)
Kana tikavhura mubrowser
Kana iwe uchida mamwe akadzama gadziriso, saka iwe unofanirwa kushandisa iyo autocert.Manager maneja. Tobva tagadzira yedu ye http.Server muenzaniso (kusvika parizvino taishandisa nekusingaperi) uye towedzera maneja kune TLSConfig server:
m := &autocert.Manager{
Cache: autocert.DirCache("golang-autocert"),
Prompt: autocert.AcceptTOS,
HostPolicy: autocert.HostWhitelist("example.org", "www.example.org"),
}
server := &http.Server{
Addr: ":443",
TLSConfig: m.TLSConfig(),
}
server.ListenAndServeTLS("", "")
Iyi inzira iri nyore yekushandisa yakazara HTTPS rutsigiro neotomatiki chitupa kuvandudzwa.
Kuwedzera tsika nzira
Iyo default router inosanganisirwa muraibhurari yakajairwa yakanaka, asi yakakosha. Mazhinji maapplication anoda kuomesesa nzira, kusanganisira nested uye wildcard nzira, kana maitiro ekuseta nzira mapatani uye paramita.
Muchiitiko ichi, zvakakodzera kushandisa mapakeji
Yakapihwa iyo faira api/v1/api.go ine nzira dzeAPI yedu:
/ 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
}
Isu tinoseta iyo api/vq prefix yenzira mune huru faira.
Isu tinogona kuzoisa izvi kune yedu hombe router pasi peapi/v1/ prefix kumashure mukushandisa kwedu kukuru:
// 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())
Go kusununguka kwekushanda nenzira dzakaoma kunoita kuti zvikwanise kurerutsa kurongeka nekugadzirisa kweakakura, akaomarara maapplication.
Kushanda ne middleware
Staging inosanganisira kuputira imwe HTTP inobata neimwe, zvichiita kuti zvikwanise kukurumidza kuita chokwadi, kumanikidza, kutema matanda, uye akati wandei mamwe mabasa.
Semuenzaniso, ngatitarisei iyo http.Handler interface; tichaishandisa kunyora mubato unotendesa vashandisi vesevhisi.
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)
})
}
Kune wechitatu bato ma routers, akadai se chi, anotendera iwe kuti uwedzere iyo yepakati mashandiro.
Kushanda nema static mafaera
Iyo Go yakajairika raibhurari inosanganisira kugona kushanda neyakagadzika zvemukati, zvinosanganisira mifananidzo, JavaScript uye CSS mafaera. Vanogona kuwanikwa kuburikidza ne http.FileServer basa. Inodzosa mubatsiri anoshandira mafaera kubva kune yakatarwa dhairekitori.
func NewRouter() http.Handler {
router := chi.NewRouter()
r.Get("/{name}", HelloName)
// Настройка раздачи статических файлов
staticPath, _ := filepath.Abs("../../static/")
fs := http.FileServer(http.Dir(staticPath))
router.Handle("/*", fs)
return r
Izvo zvakakodzera kuyeuka kuti http.Dir inoratidza zviri mukati medhairekitori kana isina iyo main index.html faira. Muchiitiko ichi, kudzivirira dhairekitori kubva pakukanganiswa, iwe unofanirwa kushandisa iyo package unindexed
Kudzima chaiko
Enda zvakare ine chinhu chinonzi nyasha kuvharika kweHTTP server. Izvi zvinogona kuitwa uchishandisa Shutdown() nzira. Sevha inotangwa mune goroutine, uye ipapo chiteshi chinoteererwa kuti igamuchire inovhiringidza chiratidzo. Pangosvika chiratidzo, sevha inodzima, asi kwete pakarepo, asi mushure memasekondi mashoma.
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)
Semhedziso
Go imutauro une simba une raibhurari yepasi rose. Yayo yekusarudzika masimba akafara kwazvo, uye anogona kukwidziridzwa uchishandisa interfaces - izvi zvinokutendera iwe kugadzira akavimbika echokwadi maseva eHTTP.
Skillbox inokurudzira:
- Makore maviri anoshanda kosi
"Ini ndiri PRO webhu developer" .- Dzidzo yepamhepo kosi
"Professional Java developer" .- Kosi yegore rimwechete
"PHP mugadziri kubva 0 kusvika PRO" .
Source: www.habr.com