แฎแฃแแ แฌแแแก แฌแแ แแแแแฌแงแ
แแก แกแขแแขแแ แแฎแแแ แกแแ แแแ แแก แแแฌแแ แแก Go-แจแ. แแแแแฌแงแแ แแแ แขแแแ แ แแฆแแชแแแแ, แ แแแแ แแชแแ "Hello World!" แแ แแแแแกแ แฃแแแ แแแแแแแชแแแ แจแแแแแแ แจแแกแแซแแแแแแแแแแ:
- Let's Encrypt-แแก แแแแแงแแแแแ HTTPS-แแกแแแแก.
- แแฃแจแแแแก API แ แแฃแขแแ แแ.
- แแฃแจแแแแ แจแฃแ แแ แแแ แแแแแแแ.
- แกแขแแขแแแฃแ แ แคแแแแแแแก แแแแฃแจแแแแแ.
- แกแฌแแ แ แแแแแ แแแ.
Skillbox แแแ แฉแแแ: แแ แแฅแขแแแฃแแ แแฃแ แกแ
"แแแแแแแก แแแแแแแแแ แ แแฃแแแแแ" .แจแแแแฎแกแแแแแ: "Habr"-แแก แงแแแแ แแแแแฎแแแแแกแแแแก - แคแแกแแแแแแแ 10 แ แฃแแแแแแ Skillbox-แแก แแแแแกแแแแ แแฃแ แกแแ แฉแแ แแชแฎแแแกแแก "Habr" แกแแ แแแแแแ แแแแแก แแแแแงแแแแแแ.
แฒแแแแ แฏแแแ แแกแแคแแแ!
แแฅแแแ แจแแแแซแแแแ แจแแฅแแแแ แแแ แกแแ แแแ แ Go-แจแ แซแแแแแ แกแฌแ แแคแแ. แแฅ แแแชแแแฃแแแ แแแแแฃแจแแแแแแแก แแแแแงแแแแแแก แแแแแแแแ, แ แแแแแแช แแแ แฃแแแแก แแแแแ แแแแแ แแแฃแ โHello, World!โ-แก.
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)
}
แแแแก แจแแแแแ แแฃ แแแฃแจแแแ แแแแแแแชแแ แแ แแแฎแกแแแแ แแแแ แแ
แฉแแแ แแแแแแแแแแแ แแ แแแแแฏแแ แแแแแแแงแแแแแ แแแแแฃแจแแแแแแแก, แแแแ แแ แฏแแ แแแแแแแ, แ แแแแ แแฃแจแแแแก แงแแแแแคแแ แ.
net/http
แแแแแแแแจแ แแแแแงแแแแแฃแแแ แแแแแขแ net/http
HTTP แแแแแฃแจแแแแแแแแ
แ แแแแกแแช แแแฆแแแ แแแแฎแแแแแก, แแแแแฃแจแแแแแแแ แแแแแแแแแแก แแแก แแ แฅแแแแก แแแกแฃแฎแก. Handlers in Go แแแแแ แแแแแ แจแแแแแแแแแ แแ:
type Handler interface {
ServeHTTP(ResponseWriter, *Request)
}
แแแ แแแแ แแแแแแแแ แแงแแแแแก http.HandleFunc แแแแฎแแแ แ แคแฃแแฅแชแแแก. แแก แแฎแแแแก แกแฎแแ แคแฃแแฅแชแแแก, แ แแแแแแช แแแแแก แแฎแ แแ แแฆแแแก http.ResponseWriter แแ http.Request-แก ServeHTTP-แจแ.
แกแฎแแ แกแแขแงแแแแแ แ แแ แแแฅแแแ, Golang-แจแ แแแแแฃแจแแแแแแแแ แฌแแ แแแแแแแแแแ แแ แ แแแขแแ แคแแแกแจแ, แ แแช แฃแแแ แแ แแแ แแแแขแก แแซแแแแก แแ แแแ แแแแกแขแก. แแแแแแแแแ, แจแฃแ แแ แแแ แแแ แแแแแ แแแแแ แแแแแฃแจแแแแแแแก แแแแแงแแแแแแ, แกแแแแช ServeHTTP แฏแแ แแแแแแแก แ แแฆแแชแแก แแ แจแแแแแ แฃแฌแแแแแก แกแฎแแ แแแแแฃแจแแแแแแแก ServeHTTP แแแแแแก.
แ แแแแ แช แแแแแ แแฆแแแแจแแ, แแแแแฃแจแแแแแแแแ แฃแแ แแแแ แฅแแแแแ แแแกแฃแฎแแแก แแแแฎแแแแแแแ. แแแแ แแ แ แแแแแ แแแแแ แแขแฃแแ แแแแแฃแจแแแแแแแ แฃแแแ แแงแแก แแแแแงแแแแแฃแแ แแ แแแก แแแแแ แแขแฃแ แแแแแแขแจแ?
แแแแแฎแแแแ แแแ แจแ แฃแขแ
แกแฌแแ แ แแ แฉแแแแแแก แแแกแแแแแแแแแ แแแแแแงแแแแ HTTP แแฃแแขแแแแแฅแกแแ แ. แ แแ แแแแแแแแแแแจแ แแแก muxer แแ แ แแฃแขแแ แก แฃแฌแแแแแแ, แแแแ แแ แแกแแแ แงแแแแ แแ แแ แแ แแแแแแ. แแฃแแขแแแแแฅแกแแ แแก แคแฃแแฅแชแแแ แแแแฎแแแแแก แแแแแแแก แแแแแแแ แแ แจแแกแแแแแแกแ แแแแแฃแจแแแแแแแก แจแแ แฉแแแ.
แแฃ แแญแแ แแแแแ แแฎแแ แแแญแแ แ แ แแฃแแ แแแ แจแ แฃแขแแแแชแแแกแแแแก, แฃแแฏแแแแกแแ แแแแแแงแแแแ แแแกแแแ แแฎแแ แแก แแแแแแแแแแแแ. แแแแแแ แแ แงแแแแแแ แแแฌแแแแแ -
แแแ แแแแฃแ แกแแขแฃแแชแแแจแ แ แแฃแ แฉแแ แฉแแแแแแ แแฃแจแแแแ แแแแแฎแแแก แแ แแกแขแแแแแ แขแฃแ แแแแแฌแงแแแขแแแแแแแก แแ แแก แแแแจแแแแแแแแแ แแ แแฃแแแแก แแแแฃแแแกแฎแแแแ แแแแแฃแจแแแแแแแแแก แแแแแงแแแแแแก. แแแแแแแชแแแแแก แแแแ แฃแแ แแแแแกแแแแก แจแแกแแฅแแแแแแ แกแแแแแ แแกแ แแฅแแแแ แแแแฃแแแกแฎแแแแ แแแแแแแแแแแกแ แแ แแแ แขแแแ แ แแฃแขแแ แแก แแแแแแแแชแแ.
แจแแแแแฎแแแก แแแแฃแจแแแแแ
แแแ แแ แแแแกแ, แฉแแแ แแแญแแ แแแแ แแแแแแแแแขแ, แ แแแแแแช โแแแแกแแแแกโ แจแแแแแแแแ แแแแจแแ แแแก แแ แแแแแแแกแแแแ แแแแก แงแแแแ แแแแฎแแแแแก แกแฌแแ แแแแแฃแจแแแแแแแแ. http.Server แแแแแแแ แฃแแแแแแแแแ แแ แแแแชแแแแก.
แจแแแแแแ แแแแฉแแแแแแก, แ แแ แกแแ แแแ แ แแแกแฃแฎแแกแแแแแแแแ แงแแแแ แแแแแแแแแแ, แ แแแแแแช แแแแแแจแแ แแแฃแแแ แแแแจแแ แแก แแแแฃแจแแแแแแกแแแ. แแก, แแแแแแแแแ, แแฃแจแแแแก TLS แแ แแขแแแแแแก แแแแแงแแแแแแ. http.ListenAndServer แแแ แแก แแแแกแแฎแแ แชแแแแแแแแ แแแแแแงแแแแแ แกแขแแแแแ แขแฃแแ HTTP แกแแ แแแ แ.
แแฎแแ แแแแแ แจแแแฎแแแแ แฃแคแ แ แ แแฃแ แแแแแแแแแแก.
แแแแแแขแแแ Let's Encrypt
แแแแฃแแแกแฎแแแแแ, แฉแแแแ แแแแแแแชแแ แแฃแจแแแแก HTTP แแ แแขแแแแแแ, แแแแ แแ แ แแแแแแแแแแฃแแแ HTTPS แแ แแขแแแแแแก แแแแแงแแแแแ. แแก แจแแแซแแแแ แแแแแแแแก แฃแแ แแแแแแแ Go-แจแ. แแฃ แแฅแแแ แแแแฆแแ แกแแ แแแคแแแแขแ แแ แแแ แแแ แแแกแแฆแแแ, แแแจแแ แกแแแแแ แแกแแ แแแแ แแแแกแขแ แแ แแ ListenAndServeTLS แกแฌแแ แ แกแแ แขแแคแแแแขแแ แแ แแแกแแฆแแแแก แคแแแแแแแ.
http.ListenAndServeTLS(":443", "cert.pem", "key.pem", nil)
แแฅแแแ แงแแแแแแแแก แจแแแแซแแแแ แฃแแแแแกแแ แแแแแแแแ.
autocert
.
แแแกแ แแแแคแแแฃแ แแชแแแก แฃแแแ แขแแแแกแ แแแแ autocert.NewListener แแแแแแแก แแแแแงแแแแแ http.Serve-แแแ แแ แแแ. แแแแแแ แกแแจแฃแแแแแแก แแแซแแแแ แแแแฆแแ แแ แแแแแแฎแแแ TLS แกแแ แแแคแแแแขแแแ, แกแแแแ HTTP แกแแ แแแ แ แแแฃแจแแแแแก แแแแฎแแแแแแก:
http.Serve(autocert.NewListener("example.com"), nil)
แแฃ แแ แแฃแแแ แจแ แแแแฎแกแแแ
แแฃ แแญแแ แแแแแ แฃแคแ แ แแแขแแแฃแ แ แแแแคแแแฃแ แแชแแ, แแแจแแ แฃแแแ แแแแแแงแแแแ autocert.Manager แแแแแฏแแ แ. แจแแแแแ แฉแแแ แแฅแแแแ แฉแแแแก แกแแแฃแแแ http.Server แแแกแขแแแชแแแก (แแฅแแแแ แแแงแแแแแแแ แแแก แแแแฃแแแกแฎแแแแแ) แแ แแแแแขแแแ แแแแแฏแแ แก 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 แแฎแแ แแแญแแ แแก แแแแกแแฎแแ แชแแแแแแแแ แกแแ แขแแคแแแแขแแก แแแขแแแแขแฃแ แ แแแแแฎแแแแแ.
แแแ แแแแฃแแ แแแ แจแ แฃแขแแแแก แแแแแขแแแ
แแแแฃแแแกแฎแแแแ แ แแฃแขแแ แ, แ แแแแแแช แจแแแแก แกแขแแแแแ แขแฃแ แแแแแแแแแแแจแ, แแแ แแแ, แแแแ แแ แแก แซแแแแแ แซแแ แแแแแแ. แแแแแแแชแแแแแก แฃแแแขแแกแแแแก แแกแแญแแ แแแแ แฃแคแ แ แ แแฃแแ แแแ แจแ แฃแขแแแแชแแ, แแแ แจแแ แแก แฉแแแแแฃแแ แแ แแแแฃแ แ แแแ แจแ แฃแขแแแ, แแ แแแแแแแแแก แจแแแแแแแแแกแ แแ แแแ แแแแขแ แแแแก แแแงแแแแแแก แแ แแชแแแฃแ แ.
แแ แจแแแแฎแแแแแจแ แฆแแ แก แแแแแขแแแแก แแแแแงแแแแแ
แแแชแแแฃแแแ แคแแแแ api/v1/api.go, แ แแแแแแช แจแแแชแแแก แแแ แจแ แฃแขแแแก แฉแแแแ API-แกแแแแก:
/ 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/ แแ แแคแแฅแกแแก แฅแแแจ แฉแแแแก แแแแแแ แแแแแแแชแแแจแ:
// 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-แก แ แแฃแ แแแ แจแ แฃแขแแแแแ แแฃแจแแแแแก แกแแแแ แขแแแ แจแแกแแซแแแแแแก แฎแแแก แแแแแ แขแแแแแก แแแแ, แ แแฃแแ แแแแแแแชแแแแแก แกแขแ แฃแฅแขแฃแ แแ แแแ แแ แจแแแแ แฉแฃแแแแ.
แแฃแจแแแแ แจแฃแแแแแฃแ แแแ
แแแแแแ แแฃแแแกแฎแแแแก แแ แแ HTTP แแแแแฃแจแแแแแแแก แแแแ แแกแแแ แจแแคแฃแแแแก, แ แแช แจแแกแแซแแแแแแก แแแฎแแแก แแแแแแขแแคแแแแชแแแก, แจแแแฃแแจแแแก, แแฃแ แแแแแก แแ แ แแแแแแแแ แกแฎแแ แคแฃแแฅแชแแแก แกแฌแ แแคแแ แจแแกแ แฃแแแแแก.
แแแแแแแแแ, แแแแแ แจแแแฎแแแแ 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, แ แแแแแแช แกแแจแฃแแแแแแก แแแซแแแแ แแแแคแแ แแแแแ แจแฃแ แแ แแแ แแแแก แคแฃแแฅแชแแแแแ แแแ.
แกแขแแขแแแฃแ แคแแแแแแแแ แแฃแจแแแแ
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 r
แแฃแชแแแแแแแ แฃแแแ แแแแฎแกแแแแแก, แ แแ http.Dir แแฉแแแแแแก แแแ แแฅแขแแ แแแจแ แจแแแแแแกแก, แแฃ แแก แแ แจแแแชแแแก แแแแแแ index.html แคแแแแก. แแ แจแแแแฎแแแแแจแ, แแแ แแฅแขแแ แแแก แแแคแฃแญแแแแก แแแแแแแ แแกแแชแแแแแแแ, แแฅแแแ แฃแแแ แแแแแแงแแแแ แแแแแขแ unindexed
แกแฌแแ แ แแแแแ แแแ
Go-แก แแกแแแ แแฅแแก แคแฃแแฅแชแแ, แกแแฎแแแฌแแแแแแ HTTP แกแแ แแแ แแก แแแฎแแแแแแ แแแแแ แแแ. แแก แจแแแซแแแแ แแแแแแแแก Shutdown() แแแแแแแก แแแแแงแแแแแแ. แกแแ แแแ แ แแฌแงแแแ แแแ แฃแขแแแแก แ แแแแแจแ, แจแแแแแ แแ แแ แฎแแก แแแกแแแแ แฎแแแแ แจแแคแแ แฎแแแแก แกแแแแแแแก แแแกแแฆแแแแ. แ แแแแ แช แแ แกแแแแแแ แแแแฆแแแ, แกแแ แแแ แ แแแแจแแแ, แแแแ แแ แแ แ แแแจแแแแ, แแ แแแแ แ แแแแแแแแ แฌแแแแก แจแแแแแ.
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 แแแ แฉแแแ:
- แแ แฌแแแแแ แแ แแฅแขแแแฃแแ แแฃแ แกแ
"แแ แแแ PRO แแแ แแแแแแแแแ แ" .- แกแแแแแแแแแแแแแแ แแแแแแ แแฃแ แกแ
"แแ แแคแแกแแ Java Developer" .- แแ แแฅแขแแแฃแแ แฌแแแก แแฃแ แกแ
"PHP แแแแแแแแแ แ 0-แแแ PRO-แแแ" .
แฌแงแแ แ: www.habr.com