
áá˝ááşáá˛áˇáá˛áˇ ááŤá¸áážá
áşááąáŹááşá á
áá˛áˇáááşá á ááŤá Golang áááŻááąáˇááŹáááŻáˇáĄáá˝ááˇáşáĄááąá¸áá
áşááŻááąá¸áááşá Go áááş á
áŹááźááˇáşáááŻááşááťáŹá¸á
á˝áŹááźááˇáş ááźááˇáşá
á˝ááşááŹá¸ááąáŹ áĄá
á˝ááşá¸áááşááąáŹááŹááŹá
ááŹá¸áá
áşááŻááźá
áşááźáąáŹááşá¸ ááťá˝ááşááąáŹáşááŹá¸áááşáá˛áˇáááşá Go áááş á
á˝ááşá
áŻáśáááźá
áşáááş- áĄáá°á¸áááźááˇáşá áááşá¸ááᯠááźáżááŹááážááᲠááŹááŹáááşáážá áĄáááŽááąá¸áážááşá¸ááťáŹá¸ áááşááŽá¸áááşáĄáá˝ááş áĄááŻáśá¸ááźáŻáááŻááşáááşá
á¤ááąáŹááşá¸ááŤá¸áááş Go áá˝ááşááŹááŹáá áşááŻááąá¸ááŹá¸ááźááşá¸áĄááźáąáŹááşá¸ááźá áşáááşá "Hello world!" áá˛áˇáááŻáˇááąáŹ áááŻá¸áážááşá¸ááąáŹáĄááŹááťáŹá¸ááźááˇáş á áááşááźáŽá¸ áĄáąáŹááşááŤá á˝ááşá¸áááşááťáŹá¸ááźááˇáş áĄáááŽááąá¸áážááşá¸áá áşááŻááźááˇáş áĄááŻáśá¸áááşááźááŤá ááŻáˇá
- HTTPS áĄáá˝ááş Let's Encrypt ááᯠáĄááŻáśá¸ááźáŻááźááşá¸á
- API Router áĄááźá
áş áĄááŻááşááŻááşááźááşá¸á
- áĄáááşáááşá¸ááąáŹáˇááşáá˛ááźááˇáş áĄááŻááşááŻááşááźááşá¸á
- static áááŻááşááťáŹá¸áááŻááŻááşááąáŹááşááźááşá¸á
- áážááşáááşááąáŹááááşááźááşá¸á
Skillbox ááž áĄááźáśááźáŻááŹá¸áááş- áááşáá˝áąáˇáááşáááşá¸ .
ááŤáááŻáˇáááşá¸áááŻáááááąá¸áááş "Habr" áá áŹáááşáá°áĄáŹá¸ááŻáśá¸áĄáá˝ááş - "Habr" ááááŻáááŻá¸áážááşá¸ááŻááşááᯠáĄááŻáśá¸ááźáŻá áááşáááˇáş Skillbox áááşáááşá¸áá˝ááşá áŹáááşá¸áá˝ááşá¸áááˇáşáĄá፠10 áá°áááşááťážáąáŹáˇá áťáąá¸á
áááşášáááŹááŤááášááŹááąáŹá!
Go áá˝ááş áááşááŹááŹáá áşááŻááᯠáááşáááşááŽá¸áááŻááşáááşá á¤áááşáážáŹ áĄáááşááąáŹáşááźá፠áááááźáŻááŹá¸áááˇáş âHello, world!â ááᯠááźááşááąá¸áááˇáş handler áááŻáĄááŻáśá¸ááźáŻááźááşá¸á áĽáááŹáá áşááŻááźá áşáááşá
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)
}ááźáŽá¸áá˝áŹá¸áááşááąáŹáˇ application ááᯠrun ááźáŽá¸ page áááŻáá˝ááˇáşáááŻááşááŤá ááŤáááŻáááş "Hello, world!" áááŻáá˛áˇ á áŹááŹá¸ááᯠááťááşááťááşá¸ááźááşáááŤááááˇáşáááşá (áĄááŹáĄáŹá¸ááŻáśá¸ áážááşáááşáááş ááŻááşááŤáááş)á
ááťá˝ááşáŻááşáááŻáˇáááş ááąáŹááşáááŻááşá¸áá˝ááş áááŻááşáá˝ááşááááááŹááᯠáĄááźáááşááťáŹá¸á á˝áŹ áĄááŻáśá¸ááźáŻááŤáááşá áááŻáˇááąáŹáş áĄááŹáĄáŹá¸ááŻáśá¸ áááşáááŻáˇáĄááŻááşááŻááşáááşááᯠáŚá¸á á˝áŹááŹá¸áááşááźááŤá ááŻáˇá
net/http
áĽáááŹá package áááŻááŻáśá¸áááşá ááŹááŹááťáŹá¸áážááˇáş HTTP ááąáŹááşáááşááťáŹá¸ áážá áşááťááŻá¸ááŻáśá¸ááᯠááąáŹáşááąáŹááşáááşáĄáá˝ááş Go áá˝ááş áĄáááááááááŹááźá áşáááşá ááŻááşáááŻááŹá¸áááşáááşá http.Handlerá http.ServeMux áážááˇáş http.Server áá°ááąáŹ áĄááąá¸ááźáŽá¸ááąáŹááźááşá ááşááŻáśá¸ááŻá áĄáááášááŤááşááᯠááŹá¸áááşááźááŤá ááŻáˇá
HTTP áááŻááşáá˝ááşáá°ááťáŹá¸
ááťá˝ááşáŻááşáááŻáˇ ááąáŹááşá¸áááŻááťááşááᯠáááşááśááážáááąáŹáĄááŤá áááŻááşáá˝ááşáá°áááş áááşá¸ááᯠáááŻááşá¸ááźáŹá¸á áááşááźáŹááźáŽá¸ ááŻáśáˇááźááşáážáŻááᯠááŻááşááąá¸ááŤáááşá Go in Handlers ááťáŹá¸ááᯠáĄáąáŹááşááŤáĄáááŻááşá¸ áĄááąáŹááşáĄáááşááąáŹáşáááş-
type Handler interface {
ServeHTTP(ResponseWriter, *Request)
}ááááĽáááŹáá˝ááş http.HandleFunc helper function áááŻáĄááŻáśá¸ááźáŻáááşá áááşá¸áááş http.ResponseWriter áážááˇáş http.Request ááᯠServeHTTP áááŻáˇ áá°ááąáŹááşáá˝áŹá¸áááˇáş áĄááźáŹá¸ááąáŹááŻááşááąáŹááşááťááşááᯠááźáŻáśááŻáśááááŤáááşá
áá áşáááşá¸áááŻáááąáŹáşá Golang áážá handlers ááťáŹá¸ááᯠááááŻááááşááŹáĄáá˝ááş áá˝áąá¸ááťááşá ááŹááťáŹá¸á á˝áŹááąá¸áááˇáş áá áşááŻáááşá¸ááąáŹ ááťááşáážáŹááźááşáá áşááŻáá˝ááş ááźáááŹá¸áááşá áááŻáˇááźáąáŹááˇáşá áĽáááŹáĄáŹá¸ááźááˇáşá ServeHTTP áá áşááŻááŻááᯠáŚá¸á á˝áŹááŻááşááąáŹááşááźáŽá¸ áĄááźáŹá¸áááŻááşáá˝ááşáá°á ServeHTTP áááşá¸áááşá¸ááᯠááąáŤáşáááˇáş áááŻááşáá˝ááşááááááŹááᯠáĄááŻáśá¸ááźáŻá áĄáááşáááşá¸ááąáŹáˇááşáá˛ááᯠáĄááąáŹááşáĄáááşááąáŹáşáááşá
áĄáááşáá˝ááşááąáŹáşááźáá˛áˇáááˇáşáĄáááŻááşá¸á áááŻááşáá˝ááşáá°ááťáŹá¸áááş ááąáŹááşá¸áááŻááťááşááťáŹá¸ááᯠááŻáśáˇááźááşáážáŻááťáŹá¸ááᯠáááŻá¸áážááşá¸á á˝áŹááŻááşááąá¸ááŤáááşá áááŻáˇááąáŹáş áĄááťáááşááŹááá áşááŻáá˝ááş áááşáááˇáşáááşáááŻááşááááááŹááᯠáĄááŻáśá¸ááźáŻáááˇáşááááşá¸á
áááşá¸ááźáąáŹááşá¸ááąáŹááşá¸áááŻááźááşá¸á
áážááşáááşááąáŹáá˝áąá¸ááťááşáážáŻááźáŻááŻááşáááş HTTP multiplexer ááᯠáĄááŻáśá¸ááźáŻááŤá á áŹááźááˇáşáááŻááşááťáŹá¸á á˝áŹáá˝ááş áááşá¸ááᯠmuxer áááŻáˇáááŻááş router ááŻááąáŤáşáá˝ááşááąáŹáşáááşá¸ áááşá¸áááŻáˇáĄáŹá¸ááŻáśá¸áááş áĄáá°áá°áááşááźá áşáááşá multiplexer áááŻááşááąáŹááşááťááşáážáŹ ááąáŹááşá¸áááŻáážáŻáááşá¸ááźáąáŹááşá¸áááŻáá˝á˛ááźááşá¸á áááşááźáŹááźáŽá¸ áááˇáşááťáąáŹáşááąáŹáááŻááşáá˝ááşáá°áááŻáá˝áąá¸ááťááşáááşááźá áşáááşá
áĄáááşá áááşáááş áážáŻááşáá˝áąá¸ááąáŹáááşá¸ááźáąáŹááşá¸áááşááźááşá¸áĄáá˝ááş ááśáˇáááŻá¸áážáŻáááŻáĄááşááŤáá ááźááşááĄáá˝á˛áˇáĄá ááşá¸á áŹááźááˇáşáááŻááşááťáŹá¸ááᯠáĄááŻáśá¸ááźáŻááźááşá¸áááş áááŻááąáŹááşá¸ááŤáááşá áĄááťááŻáˇááąáŹ áĄáááˇáşááźááˇáşááŻáśá¸- и á¤á áŹááźááˇáşáááŻááşááťáŹá¸áááş ááźáżááŹáá áşá áŻáśáá áşááŹááážááᲠáĄáááşáĄáááşááŻááşááąáŹááşááźááşá¸ááᯠáĄááąáŹááşáĄáááşááąáŹáşáááŻááşá áąáááşá áááşá¸áááŻáˇááĄáá°áĄááŽááźááˇáşá áááşáááş wildcard áááşá¸ááźáąáŹááşá¸áááşáážááşááźááşá¸ááᯠáááşáážááşáááŻááşááźáŽá¸ áĄááźáŹá¸ááŻááşááąáŹááşá ááŹááťáŹá¸á á˝áŹááᯠááŻááşááąáŹááşáááŻááşáááşá áááşá¸áááŻáˇááĄáŹá¸ááŹááťááşáážáŹ á áś HTTP áááŻááşáá˝ááşáá°ááťáŹá¸áážááˇáş áááŻááşáááşááŽáážáŻááźá áşáááşá ááááşáĄááąááźááˇáşá áááşáááş áĄááŹáááşáá˝ááş ááźáŻááźááşáááŻááşááąáŹ áááŻá¸áážááşá¸ááąáŹááŻááşááᯠááąá¸ááŹá¸áááŻááşáááşá
ááŻáśáážááşáĄááźáąáĄááąáá áşááŻáá˝ááş áážáŻááşáá˝áąá¸ááąáŹááąáŹááşááťáŹá¸áážááˇáşáĄáá° áĄááŻááşááŻááşááźááşá¸áááş á áśáááŻááşááąáŹááźáąáážááşá¸áááşá¸ááťáŹá¸ áááŻáĄááşáááşááźá áşááźáŽá¸ áááşá¸áááş ááŻáśááąáááŻááşáá˝ááşáá°áĄááŻáśá¸ááźáŻáážáŻááᯠááááááŹááŹáážáŻááşáá˝áąá¸á áąáááşá áĄáááŽááąá¸áážááşá¸ áĄááťáŹá¸á áŻááᯠáááşááŽá¸áááşá ááŻáśááąá áŹááźááˇáşáááŻááşáážááˇáş áááŻá¸áááŻá¸ router ááąáŤááşá¸á ááşáážáŻ ááŻáśááąáŹááşáááşááźá áşáááşá
ááąá¸ááźááşá¸áážáŻ ááŻááşááąáŹááşááźááşá¸á
áááŻáˇáĄááźááşá áĄáááşááťáááşáááşáážáŻááťáŹá¸áĄáá˝ááş "ááŹá¸áááş" áááˇáş áĄá áááşáĄáááŻááşá¸áá áşáᯠáááŻáĄááşááźáŽá¸ ááąáŹááşá¸áááŻááťááşáĄáŹá¸ááŻáśá¸ááᯠáážááşáááşááąáŹ áááŻááşáá˝ááşáá°ááś ááźááşáá˝ážááşá¸ááąá¸áááˇáş áĄá áááşáĄáááŻááşá¸áá áşáᯠáááŻáĄááşááŤáááşá http.Server áááş á¤ááŻááşáááşá¸ááᯠáĄáá˝ááşááá° áááŻááşáá˝ááşáááŻááşáááşá
ááťáááşáááşáážáŻ ááŻááşááąáŹááşááźááşá¸áážááˇáş áááşá ááşáááˇáş áĄááŻááşáĄáŹá¸ááŻáśá¸áĄáá˝ááş ááŹááŹáááş ááŹáááşáážáááźáąáŹááşá¸ áĄáąáŹááşááŤáááŻáˇá ááźááááşá áĽáááŹá áááşá¸áááş TLS ááááŻáááŻááąáŹááᯠáĄááŻáśá¸ááźáŻá áĄááŻááşááŻááşáááşá http.ListenAndServer ááąáŤáşáááŻáážáŻááᯠáĄááąáŹááşáĄáááşááąáŹáşáááşá ááŻáśáážááş HTTP ááŹááŹááᯠáĄááŻáśá¸ááźáŻáááşá
ááᯠáááŻáááŻáážáŻááşáá˝áąá¸ááąáŹ áĽáááŹááťáŹá¸ááᯠááźááˇáşááźááŤá ááŻáˇá
á áŹáážááşáááˇáşááźááŤá ááŻáˇ
áá°áááşá¸áĄáŹá¸ááźááˇáşá ááťá˝ááşáŻááşáááŻáˇá áĄáááŽááąá¸áážááşá¸áááş HTTP ááááŻáááŻááąáŹááᯠááťáąáŹáşá ááŻááşááąáŹááşááąáŹáşáááşá¸ HTTPS ááááŻáááŻááąáŹááᯠáĄááŻáśá¸ááźáŻáááş áĄááźáśááźáŻááŹá¸áááşá Go áá˝ááş ááźáżááŹááážááᲠáááşá¸ááᯠááŻááşááąáŹááşáááŻááşáááşá áĄáááşá áááşáááş áááşáážááşáážááˇáş ááŽá¸áááˇáşááąáŹáˇááᯠáááşááśááážáááŤáá áážááşáááşááąáŹ áááşáážááşáážááˇáş ááąáŹáˇáááŻááşááťáŹá¸ááźááˇáş ListenAndServeTLS ááᯠá áŹáááşá¸áá˝ááşá¸áááş ááŻáśááąáŹááşááŤáááşá
http.ListenAndServeTLS(":443", "cert.pem", "key.pem", nil)áĄááźá˛áááşá¸ áááŻááąáŹááşá¸áĄáąáŹááşááŻááşáááŻááşáááşá
áĄáááŻáĄááťáąáŹááşáááşáááşá¸áááŻá¸ááźááşá¸ááźááˇáş áĄááá˛áˇáááşáážááşááťáŹá¸ááᯠááąá¸áááşá áááşááąáŹááşáážáŻáááŻáĄááŻáśá¸ááźáŻáááşáĄáá˝ááş áááşááąáˇááşáťáá
áşáᯠáááŻáĄááşááŤáááşá autocert.
áááşá¸ááᯠconfigure ááŻááşáááş áĄáá˝ááşáá°ááŻáśá¸áááşá¸áááşá¸áážáŹ http.Serve áážááˇáş ááąáŤááşá¸á ááşááŹá¸ááąáŹ autocert.NewListener áááşá¸áááşá¸ááᯠáĄááŻáśá¸ááźáŻááźááşá¸ááźá áşáááşá HTTP ááŹááŹááž ááąáŹááşá¸áááŻáážáŻááťáŹá¸ááᯠááŻááşááąáŹááşááąááťáááşáá˝ááş áááşá¸áááşá¸áááş áááˇáşáĄáŹá¸ TLS áááşáážááşááťáŹá¸ááᯠááá°ááźáŽá¸ áĄááşááááşááŻááşáááş áá˝ááˇáşááźáŻáááş-
http.Serve(autocert.NewListener("example.com"), nil)áááąáŹááşááŹáážáŹ áá˝ááˇáşáááŻááşáááş HTTPS ááŻáśáˇááźááşáážáŻ "áááşášáááŹá፠ááášááŹ!"
áááşáááŻáááŻáĄááąá¸á áááşáá˝á˛áˇá ááşá¸ááŻáśáááŻáĄááşááŤáá autocert.Manager áááşááąááťáŹááᯠáĄááŻáśá¸ááźáŻáááˇáşáááşá áááŻáˇááąáŹááş ááťá˝ááşáŻááşáááŻáˇáááş ááťá˝ááşáŻááşáááŻáˇááááŻááşáááŻááş http.Server instance áááŻáááşááŽá¸ááźáŽá¸ (áááŻááťá˝ááşáŻááşáááŻáˇáá°ááĄáŹá¸ááźááˇáş áááşá¸áááŻáĄááŻáśá¸ááźáŻáá˛áˇáááş) áážááˇáş áááşááąááťáŹááᯠTLSConfig ááŹááŹáááŻáˇ áááˇáşááŤ-
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("", "")áááşá¸áááş áĄáááŻáĄááťáąáŹááş áááşáážááş áááşáááşá¸áááŻá¸ááźááşá¸ááźááˇáş HTTPS ááśáˇáááŻá¸áážáŻ áĄááźááˇáşáĄá áŻáśááᯠáĄááąáŹááşáĄáááşááąáŹáşáááş áá˝ááşáá°ááąáŹ áááşá¸áááşá¸ááźá áşáááşá
á áááşááźááŻááşáááşá¸ááźáąáŹááşá¸ááťáŹá¸áááˇáşááźááşá¸á
á áśá áŹááźááˇáşáááŻááşáá˝ááş ááŤáááşááąáŹ áá°áááşá¸ router áááş ááąáŹááşá¸áá˝ááşááąáŹáşáááşá¸ áááşá¸áááş áĄáá˝ááşáĄááźáąááśáááşá áĄáááŽááąá¸áážááşá¸áĄááťáŹá¸á áŻáááş nested áážááˇáş wildcard áááşá¸ááźáąáŹááşá¸ááťáŹá¸ áĄááŤáĄáááş áááŻáááŻáážáŻááşáá˝áąá¸ááąáŹáááşá¸ááźáąáŹááşá¸ááťáŹá¸ áááŻáĄááşáááş áááŻáˇáááŻááş áááşá¸ááźáąáŹááşá¸ááŻáśá áśááťáŹá¸áážááˇáş áááˇáşáááşááťááşááťáŹá¸ááᯠáááşáážááşáááşáĄáá˝ááş ááŻááşááŻáśá¸ááŻááşáááşá¸áá áşáᯠáááŻáĄááşááŤáááşá
á¤ááá ášá áá˝ááşáááşá¸áááş packages ááťáŹá¸áááŻáĄááŻáśá¸ááźáŻáááťááŻá¸áááşáááşá и . ááťá˝ááşáŻááşáááŻáˇáááş ááąáŹááşáááŻááşá¸áá˝ááş áááşáááŻáˇááŻááşááąáŹááşááááşááᯠááąáˇááŹááŤáááş - áĽáááŹáá áşááŻááᯠáĄáąáŹááşáá˝ááş ááźááŹá¸áááşá
ááťá˝ááşáŻááşáááŻáˇá API áĄáá˝ááş áááşá¸ááźáąáŹááşá¸ááťáŹá¸ááŤáážáááąáŹ api/v1/api.go áááŻááşááᯠááąá¸ááŹá¸ááŤáááşá
/ 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
}ááťá˝ááşáŻááşáááŻáˇáááş áááşááááŻááşáážá áááşá¸ááźáąáŹááşá¸ááťáŹá¸áĄáá˝ááş api/vq áážáąáˇáááşááᯠáááşáážááşááąá¸áááşá
áááŻáˇááąáŹááş ááťá˝ááşáŻááşáááŻáˇáááş ááťá˝ááşáŻááşáááŻáˇááááşááĄáááŽááąá¸áážááşá¸áá˝ááş api/v1/ prefix áĄáąáŹááşáážá ááťá˝ááşáŻááşáááŻáˇááááşá router áááŻáˇ áááşáááşáááŻááşáááş-
// 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 ááážáŻááşáá˝áąá¸ááąáŹáááşá¸ááźáąáŹááşá¸ááťáŹá¸áážááˇáşáĄááŻááşááŻááşááá˝ááşáá°ááźááşá¸áááşááźáŽá¸ááŹá¸ááźáŽá¸áážáŻááşáá˝áąá¸ááąáŹáĄááŻáśá¸ááťááááŻááááşááťáŹá¸ááá˝á˛áˇá ááşá¸ááŻáśáážááˇáşááááşá¸ááááşá¸áážáŻáááŻáááŻá¸áážááşá¸áá˝ááşáá°á áąáááşá
áĄáááşáááşá¸ááąáŹáˇááşáá˛ááźááˇáş áĄááŻááşááŻááşáááşá
Staging áá˝ááş HTTP handler áá áşááŻáśá¸ááᯠáĄááźáŹá¸áá áşááŻáážááˇáş áááşááŹá¸ááźááşá¸ááźááˇáş authenticationá compressioná logging áážááˇáş áĄááźáŹá¸ááąáŹ function áĄááťáŹá¸áĄááźáŹá¸ááᯠááťááşááźááşá á˝áŹ ááŻááşááąáŹááşáááŻááşá áąááŤáááşá
áĽáááŹáĄááąáá˛áˇá http.Handler áĄááşááŹááąáˇá áşááᯠááźááˇáşááĄáąáŹááşá áááşááąáŹááşáážáŻáĄááŻáśá¸ááźáŻáá°áá˝áąááᯠá á áşáážááşááźáąáŹááşá¸áĄááąáŹááşáĄááŹá¸ááźáá˛áˇ áááşáááŻááşáááŻááąá¸áááŻáˇ áĄááŻáśá¸ááźáŻááŤáááşá
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)
})
}áĄáááşáááşá¸ááąáŹáˇááşáá˛ááŻááşááąáŹááşáááŻááşá á˝ááşá¸ááᯠáááŻá¸ááťá˛áˇáá˝ááˇáşááźáŻáááˇáş Chi áá˛áˇáááŻáˇááąáŹ ááźááşááĄáá˝á˛áˇáĄá ááşá¸ááąáŹááşááŹááťáŹá¸áážááááşá
static áááŻááşááťáŹá¸áážááˇáşáĄááŻááşááŻááşááźááşá¸á
Go á áśááźá áŹááźááˇáşáááŻááşáá˝ááş ááŻáśááťáŹá¸á JavaScript áážááˇáş CSS áááŻááşááťáŹá¸áĄááŤáĄáááş áááşááźáááşááąáŹáĄááźáąáŹááşá¸áĄááŹááźááˇáş ááŻááşááąáŹááşáááŻááşááąáŹ á á˝ááşá¸áááşááťáŹá¸ ááŤáááşáááşá áááşá¸áááŻáˇááᯠhttp.FileServer ááŻááşááąáŹááşááťááşááźááˇáş áááşááąáŹááşááźááˇáşáážáŻáááŻááşááŤáááşá áááşá¸áááş ááŽá¸ááźáŹá¸áááşá¸áá˝ážááşáá áşááŻááž áááŻááşááťáŹá¸ááᯠááąáŹááşáá˝ááşááąá¸áááˇáş áááŻááşáá˝ááşáá°ááᯠááźááşááąá¸áááşá
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 rhttp.Dir áááş áááşá index.html áááŻááşáááŤáááşááŤá áááşá¸áá˝ážááşá áĄááźáąáŹááşá¸áĄááŹááťáŹá¸ááᯠááźááááşáážáŹ ááąááťáŹááŤáááşá á¤ááá ášá áá˝ááşá áááşá¸áá˝ážááşáááŻáĄáááŻá¸ááśáááźááşá¸áážááŹáá˝ááşáááşá áááşáĄááŻááşáááŻáĄááŻáśá¸ááźáŻáááˇáşáááşá .
áážááşáááşááąáŹááááşááźááşá¸á
Go áá˝ááş HTTP ááŹááŹááᯠáááşáááşá á˝áŹááááşááźááşá¸ááŻááąáŤáşáááˇáş áĄááşášááŤáááşáá áşááŻáááşá¸ ááŤáážááááşá Shutdown() method ááᯠáĄááŻáśá¸ááźáŻá ááŻááşááąáŹááşáááŻááşááŤáááşá ááŹááŹááᯠáááŻáááŻá¸áááşá¸ááŻáśá áśááźááˇáş á áááşááŹá¸ááźáŽá¸á áááŻáˇááąáŹááşáá˝ááş ááźáŹá¸ááźááşáĄááťááşááźáážáŻááᯠáááşááśááážááááş ááťááşáááşááᯠááŹá¸ááąáŹááşáááşá áĄááťááşááźááźááşá¸ááᯠáááşááśááážááááşáážááˇáş áááźááŻááşáááş ááŹááŹáááş ááááşáá˝áŹá¸ááąáŹáşáááşá¸ ááťááşááťááşá¸áááŻááşááąáŹáşáááşá¸ á áášáááˇáşáĄáááşá¸áááşááźáŹááźáŽá¸ááąáŹááşá
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)ááááŻáśá¸ááťáŻááş
Go áááş á ááźáá Ꮰá áśááźá áŹááźááˇáşáááŻááşááŤáážáááąáŹ áĄáŹá¸ááąáŹááşá¸ááąáŹááşá¸áááşááŹááŹá ááŹá¸áá áşááŻááźá áşáááşá áááşá¸ááá°áá á˝ááşá¸áááşááťáŹá¸áááş áĄáá˝ááşááťááşááźááˇáşááźáŽá¸ áááşá¸áááŻáˇááᯠáĄááşááŹááąáˇá áşááťáŹá¸áĄááŻáśá¸ááźáŻá ááźážááˇáşáááşáááŻááşáááş - áááşá¸áááş áááˇáşáĄáŹá¸ áĄáážááşááááşááŻáśááźááşá áááşááťáááąáŹ HTTP ááŹááŹááťáŹá¸ááᯠááŽáá˝ááşáááŻááşá áąáááşááźá áşáááşá
Skillbox ááž áĄááźáśááźáŻááŹá¸áááş-
- áážá áşáážá áşá áŹáááşáá˝áąáˇáááşáááşá¸ .
- áááŹááąá¸áĄá˝ááşáááŻááşá¸áááşáááşá¸ .
- áááşáá˝áąáˇ áá áşáážá áşáááşáááşá¸ .
source: www.habr.com
