ืืื ืคืื ืฃ ืืืจ ืฆืืจืืง ืืื ืื ืืขืืืืื
ืืขืจ ืึทืจืืืงื ืืื ืืืขืื ืฉืจืืืื ืึท ืกืขืจืืืขืจ ืืื Go. ืืึธืืืจ ืึธื ืืืืื ืืื ืคึผืฉืื ืืื ืื ืืื "ืืขืื ืืืขืื!" ืืื ืกืืฃ ืืื ืึท ืึทืคึผืืึทืงืืืฉืึทื ืืื ืื ืคืืืืขื ืืข ืงืืืคึผืึทืืืืึทืืื:
- ื ืืฆื Let's Encrypt ืคึฟืึทืจ HTTPS.
- ืืจืืขืื ืืื ืึท ืึทืคึผื ืจืึทืืืขืจ.
- ืืจืืขืื ืืื ืืืืืืืึทืจืข.
- ืคึผืจืึทืกืขืกืื ื ืคืื ืกืืึทืืืง ืืขืงืขืก.
โ ืจืืืืืงืข ืคืืจืฉืืืกื.
Skillbox ืจืขืงืึทืืขื ืื: ืคึผืจืึทืงืืืฉ ืงืืจืก
"Python ืืขืืืขืืึธืคึผืขืจ ืคึฟืื ืงืจืึทืฆื" .ืืืจ ืืขืจืืึธื ืขื ืืืจ: ืคึฟืึทืจ ืึทืืข ืืืืขื ืขืจ ืคืื "ืืืจ" - ืึท ืึทืจืึธืคึผืจืขืืขื ืขื ืคืื 10 ืจืืื ืืืขื ืืืจ ืคืึทืจืฉืจืืึทืื ืืื ืงืืื ืกืงืืืืึธืงืก ืงืืจืก ื ืืฆื ืื ืคึผืขืจืืึธืืฉืึทื ืึทื ืงืึธื "ืืืจ".
ืืขืื ืืืขืื!
ืืืจ ืงืขื ืขื ืืึทืื ืึท ืืืขื ืกืขืจืืืขืจ ืืื Go ืืืืขืจ ืืขืฉืืืื ื. ืืึธ ืืื ืึท ืืืืฉืคึผืื ืคืื ื ืืฆื ืึท ืืึทื ืืืขืจ ืืืึธืก ืงืขืจื ืื "ืืขืื, ืืืขืื!" ืฆืืืขืืืื ืืืืื.
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
ืืืืคึผ ืืึทื ืืืขืจืก
ืืืขื ืืืจ ืืึทืงืืืขื ืึท ืืงืฉื, ืืขืจ ืืึทื ืืืขืจ ืึทื ืึทืืืืขืก ืขืก ืืื ืืืฉืขื ืขืจืืืฅ ืึท ืขื ืืคืขืจ. ืืึทื ืืืขืจืก ืืื Go ืืขื ืขื ืืืคึผืืึทืืขื ืึทื ืืื ืืืื:
type Handler interface {
ServeHTTP(ResponseWriter, *Request)
}
ืืขืจ ืขืจืฉืืขืจ ืืืึทืฉืคึผืื ื ืืฆื ืื http.HandleFunc ืืขืืคืขืจ ืคึฟืื ืงืฆืืข. ืขืก ืจืึทืคึผืก ืื ืื ืืขืจ ืคึฟืื ืงืฆืืข, ืืืึธืก ืืื ืงืขืจ ื ืขืื http.ResponseWriter ืืื http.Request ืืื ServeHTTP.
ืืื ืื ืืขืจืข ืืืขืจืืขืจ, ืืึทื ืืืขืจืก ืืื Golang ืืขื ืขื ืืขืจืืื ืื ืืื ืึท ืืืื ืฆืืืื ื, ืืืึธืก ืืื ืึท ืคึผืืึทืฅ ืคืื ืึธืคึผืฆืืขืก ืฆื ืื ืคึผืจืึธืืจืึทืืืกื. ืึทืืื, ืคึฟืึทืจ ืืืึทืฉืคึผืื, ืืืืึทืืืืึทืจืข ืืื ืืืคึผืืึทืืขื ืึทื ื ืืฆื ืึท ืืึทื ืืืขืจ, ืืื ServeHTTP ืขืจืฉืืขืจ ืืื ืขืคึผืขืก ืืื ืืึทื ืจืืคื ืื ServeHTTP ืืืคึฟื ืคืื ืื ืื ืืขืจ ืืึทื ืืืขืจ.
ืืื ืืขืจืืื ื ืืืืื, ืืึทื ืืืขืจืก ืคืฉืื ืืืฉืขื ืขืจืืื ืจืขืกืคึผืึธื ืกืขืก ืฆื ืจืืงืืืขืก. ืึธืืขืจ ืืืึธืก ืืึทืืื ืืขืจ ืืึทื ืืืขืจ ืืึธื ืืืื ืืขืืืืื ื ืืื ืึท ืืึทืืื ืืขืจ ืคืื ื ืืื ืฆืืื?
ืืขืื ืจืืืื ื
ืฆื ืืึทืื ืื ืจืขืื ืืจืืจื, ื ืืฆื ืึท ืืืืคึผ ืืืืืืคึผืืขืงืกืขืจ. ืืื ืึท ื ืืืขืจ ืคืื ืืืืืจืขืจืื ืขืก ืืื ืืขืจืืคื ืืืงืกืขืจ ืึธืืขืจ ืจืึทืืืขืจ, ืึธืืขืจ ืืื ืืขื ืขื ืึทืืข ืื ืืขืืืข ืืึทื. ืื ืคืื ืงืฆืืข ืคืื โโโโืื ืืืืืืคึผืืขืงืกืขืจ ืืื ืฆื ืคืื ืึทื ืืขืจืงืืืึทืื ืื ืืขืื ืืจื ืืื ืกืขืืขืงืืืจื ืืขื ืฆืื ืขืืขื ืืึทื ืืืขืจ.
ืืืื ืืืจ ืืึทืจืคึฟื ืฉืืืฆื ืคึฟืึทืจ ืงืึธืืคึผืืขืงืก ืจืืืื ื, ืขืก ืืื ืืขืกืขืจ ืฆื ื ืืฆื ืืจืื-ืคึผืึทืจืืื ืืืืืจืขืจืื. ืขืืืขืืข ืคืื โโืื ืืขืจืกื ืึทืืืึทื ืกืืจืืข -
ืืจืืขืื ืืื ืงืึธืืคึผืืขืงืก ืคืจืึทืืขืืืึธืจืงืก ืืื ืึท ื ืึธืจืืึทื ืกืืืืึทืฆืืข ืืืขื ืืึทืจืคื ื ืื-ื ืึธืจืืึทื ืกืึทืืืฉืึทื ื, ืืื ืืึธืก ืืืืืืืืง ืงืึทืืคึผืืืงืืืฅ ืื ื ืืฆื ืคืื ืคืขืืืงืืึทื ืืึทื ืืืขืจืก. ืฆื ืฉืึทืคึฟื ืื ืืืึทืกื ืืขืจืืืึทื ืคืื ืึทืคึผืืึทืงืืืฉืึทื ื, ืึท ืงืึธืืืื ืึทืฆืืข ืคืื โโโโืื ืคืขืืืงืืึทื ืืืืืืึธืืขืง ืืื ืึท ืคึผืฉืื ืจืึทืืืขืจ ืืืขื ืืืื ืืขื ืื.
ืึธื ืคึฟืจืขื ืคึผืจืึทืกืขืกืื ื
ืืื ืึทืืืฉืึทื, ืืืจ ืืึทืจืคึฟื ืึท ืงืึธืืคึผืึธื ืขื ื ืืืึธืก ืืืขื "ืืขืจื" ืคึฟืึทืจ ืื ืงืึทืืื ื ืงืึทื ืขืงืฉืึทื ื ืืื ืจืืืขืจืขืงื ืึทืืข ืจืืงืืืขืก ืฆื ืื ืจืืืืืง ืืึทื ืืืขืจ. ืืืืคึผ.ืกืขืจืืืขืจ ืงืขื ืขื ืืืืื ืฉืขืคึผื ืืขื ืึทืจืืขื.
ืื ืคืืืืขื ืืข ืืืืืื ืึทื ืืขืจ ืกืขืจืืืขืจ ืืื ืคืึทืจืึทื ืืืืึธืจืืืขื ืคึฟืึทืจ ืึทืืข ืืึทืกืงืก ืืืึธืก ืืขื ืขื ืฉืืื ืฆื ืงืฉืจ ืคึผืจืึทืกืขืกืื ื. ืืึธืก, ืืืฉื, ืึทืจืืขื ืืื ืื TLS ืคึผืจืึธืืึธืงืึธื. ืฆื ืื ืกืืจืืืขื ื ืื http.ListenAndServer ืจืืคื, ืึท ื ืึธืจืืึทื ืืืืคึผ ืกืขืจืืืขืจ ืืื ืืขื ืืฆื.
ืืืฆื ืืึธืืืจ ืงืืงื ืืื ืืขืจ ืงืึธืืคึผืืืฆืืจื ืืืืฉืคืืื.
ืึทืืื ื ืืื ืก ืขื ืงืจืืคึผื
ืืืจื ืคืขืืืงืืึทื, ืืื ืืืขืจ ืึทืคึผืืึทืงืืืฉืึทื ืืืืคื ืืืืขืจ ืื 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 ืืื ืจืืฅ ืคึฟืึทืจ ืืื ืืืขืจ ืึทืคึผื:
/ 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
}
ืืืจ ืฉืืขืื ืื ืึทืคึผื / ืืืง ืคึผืจืขืคืืงืก ืคึฟืึทืจ ืจืืฅ ืืื ืื ืืืืคึผื ืืขืงืข.
ืืืจ ืงืขื ืขื ืืขืจืืืขืจ ืึธื ืงืืึทืคึผื ืืขื ืฆื ืืื ืืืขืจ ืืืืคึผื ืจืึทืืืขืจ ืืื ืืขืจ ืื ืึทืคึผื / ืื1 / ืคึผืจืขืคืืงืก ืฆืืจืืง ืืื ืืื ืืืขืจ ืืืืคึผื ืึทืคึผืืึทืงืืืฉืึทื:
// 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())
ืืึธ ืก ืื ืคืื ืืจืืขืื ืืื ืงืึธืืคึผืืขืงืก ืจืืฅ ืืืื ืขืก ืืขืืืขื ืฆื ืคืึทืจืคึผืึธืฉืขืืขืจื ืื ืกืืจืึทืงืืฉืขืจืื ื ืืื ืืืฉืึทืื ืคืื ืืจืืืก, ืงืึธืืคึผืืขืงืก ืึทืคึผืืึทืงืืืฉืึทื ื.
ืึทืจืืขื ืืื ืืืืืืืึทืจืข
ืกืืึทืืื ื ืื ืืืึทืืืื ืจืึทืคึผืื ื ืืืื ืืืืคึผ ืืึทื ืืืขืจ ืืื ืื ืืขืจื, ืืืื ืขืก ืืขืืืขื ืฆื ืืขืฉืืืื ื ืืืจืืคืืจื ืึธืืขื ืืึทืงืืืฉืึทื, ืงืึทืืคึผืจืขืฉืึทื, ืืึธืืื ื ืืื ืขืืืขืืข ืื ืืขืจืข ืคืึทื ืืงืฉืึทื ื.
ืืื ืึท ืืืืฉืคึผืื, ืืึธืืืจ ืงืืงื ืืื ืื ืืืืคึผ.ืืึทื ืืืขืจ ืฆืืืื ื; ืืืจ ืืืขืื ื ืืฆื ืขืก ืฆื ืฉืจืืึทืื ืึท ืืึทื ืืืขืจ ืืืึธืก ืึธืืขื ืืึทืงืืืฅ ืกืขืจืืืืก ื ืืฆืขืจืก.
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)
})
}
ืขืก ืืขื ืขื ืืจืื-ืคึผืึทืจืืื ืจืึธืืืขืจืก, ืึทืืึท ืืื ืงืื, ืืืึธืก ืืึธืื ืืืจ ืฆื ืคืึทืจืืจืืืืขืจื ืื ืคืึทื ืืงืฉืึทื ืึทืืืื ืคืื ืืืืืืึทืจืข.
ืึทืจืืขื ืืื ืกืืึทืืืง ืืขืงืขืก
ืื Go ืกืืึทื ืืึทืจื ืืืืืืึธืืขืง ืืืื ืงืืืคึผืึทืืืืึทืืื ืคึฟืึทืจ ืืจืืขืื ืืื ืกืืึทืืืง ืืื ืืึทืื, ืึทืจืืึทื ืืขืจืขืื ื ืืืืืขืจ, ืืืฉืึทืืืึทืกืงืจืืคึผื ืืื 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 ืืืื ืืื ืึท ืฉืืจืื ืืขืจืืคื ืืจืึทืฆืืขื ืฉืึทืืืึทืื ืคืื ืื ืืืืคึผ ืกืขืจืืืขืจ. ืืขื ืงืขื ืขื ืืืื ืืขืืื ืืื ืื 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 ืืื ืึท ืฉืืึทืจืง ืฉืคึผืจืึทื ืืื ืึท ืึผืืขื ืื ืืืืขืจืกืึทื ื ืึธืจืืึทื ืืืืืืึธืืขืง. ืื ืคืขืืืงืืึทื ืงืืืคึผืึทืืืืึทืืื ืืขื ืขื ืืืืขืจ ืืจืืื, ืืื ืืื ืงืขื ืขื ืืืื ืืืคึผืจืืืื ืืื ืื ืืขืจืคืืืกืื - ืืึธืก ืึทืืึทืื ืืืจ ืฆื ืึทื ืืืืืงืืขื ืืืืช ืคืึทืจืืึธืืืขื ืืืืคึผ ืกืขืจืืืขืจืก.
Skillbox ืจืขืงืึทืืขื ืื:
- ืฆืืืื-ืืึธืจ ืคึผืจืึทืงืืืฉ ืงืืจืก
"ืืื ืืื ืึท ืคึผืจืึธ ืืืขื ืืขืืืขืืึธืคึผืขืจ" .- ืืืืืื ืืงืจืืื ืึธื ืืืื ืงืืจืก
"ืคืึทื ืืืฉืึทืืืึท ืืขืืืขืืึธืคึผืขืจ" .- ืคึผืจืึทืงืืืฉ ืืึธืจ ืงืืจืก
"PHP ืืขืืืขืืึธืคึผืขืจ ืคึฟืื 0 ืฆื ืคึผืจืึธ" .
ืืงืืจ: www.habr.com