ααΆαααΈααααΆαααααΆααα»ααααα»αααΆαα
αΆααααααΎα
α’αααααααααα·ααΆαα’αααΈααΆαααααααααΆαααΈααααα αααα»α Go α αααα αΆααααααΎαααΆαα½αααΏαααΆαααααααΌα ααΆ "Hello world!" α αΎααααα ααααααααααα·ααΈαααααΆααα»αααΆαααΆαααααα
- ααΆαααααΎααααΆαα Let's Encrypt αααααΆαα HTTPS α
- ααααΎααΆαααΆααααααα API α
- ααααΎααΆαααΆαα½αα§ααααααααααΆαα
- αααααααΆαα―αααΆααα·αα·ααααα
- ααΆααα·αααααΉαααααΌαα
Skillbox ααααΆαα αααααα·ααααΆααΆααααααα
"α’αααα’αα·αααααα Python ααΈααααΌα" .ααΎαααααΉαα αααααΆααα’αααα’αΆαααΆααα’αααα "Habr" - ααΆααααα α»αααααα 10 rubles αα αααα α»αααααααααα»ααααααα·ααααΆ Skillbox ααΆαα½ααααααααΎαααααΌαααααααααααΆα "Habr" α
αα½ααααΈβαα·ααααα!
ααΆααααααΎααααΆαααΈαααααα ααααααα αααα»α 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
α§ααΆα αααααΆαααααΎαααα
αα net/http
α’ααααααααααΆα HTTP
αα αααααΎαααα½αααΆαααααΎ α’αααααααααααααααααΆ α αΎααααααΎαααΆαααααΎαααα Handlers in Go ααααΌαααΆαα’αα»ααααααΌα ααΆααααααα
type Handler interface {
ServeHTTP(ResponseWriter, *Request)
}
α§ααΆα αααααΈαα½αααααΎαα»αααΆααααα½α http.HandleFunc α ααΆαα»ααα»αααΆααα½ααααααααααααααα½ααα http.ResponseWriter αα·α http.Request αααα»α ServeHTTP α
αααααΆααα·αααα α’ααααααααααΆααα αααα»α Golang ααααΌαααΆαααααΆααααα ααα»α αααααΆαααααα½α ααααααααα±ααΆαα αααΎααααααΆααα’αααααααααααααα·ααΈα ααΌα αααα ααΆα§ααΆα ααα α§ααααααααααΆαααααΌαααΆαα’αα»αααααααααααΎα§ααααααααααααΆα ααα ServeHTTP ααααΌαααααΎα’αααΈαα½α α αΎααααααΆααααα α αα·ααΈααΆααααα ServeHTTP ααααα’ααααααααααΆαααααααααα
ααΌα αααααΆααααααΆααααΆαααΎ α’ααααααααααΆαααααΆαααααααααΎαααΆαααααΎααααα ααΉαααααΎα ααα»ααααααΎα§ααααααααααααΆααα½αααΆαααααααΌαααααΎαα αααααΆααααΆαααα½α?
ααααΎαααααΌα
ααΎααααΈααααΎααΆαααααΎαααΎαααααΉαααααΌα ααΌαααααΎ HTTP multiplexer α αα αααα»ααααααΆααααα½αα ααα½αααΆααααΌαααΆαααα α ααΆ muxer α¬ Router ααα»αααααα½αααΆααΌα ααααΆααΆααα’ααα αα»αααΆααααα multiplexer ααΊααΎααααΈαα·ααΆαααααΌαααααΎαα»α α αΎαααααΎαααΎα handler αααααααααα
ααααα·αααΎα’αααααααΌαααΆαααΆαααΆαααααααααΆααααααΌααααα»αααααΆα αααααΆααΆααΆααααααΎααααα»αααΆαααααΎααααΆαααααααΆαααααΆααΈααΈααΈα αα½ααααα»αα
ααααααααα·αααααααααα»αα
ααΆαααααΎααΆαααΆαα½αααααααααααααα»αααααααΆααααα»αααααΆαααΆαααααααΆααΉααααααΌαα±ααααΆααααααααααΆαααααα·αααΆααααααααααααααΆα α αΎααααααααΎα±αααααα»αααααΆααααΆαααααΆαααααααΆαααααΎααααΆααα§ααααααααααααΆαααααΆαααΎαα ααΆααα½ααααα αΌαααααΆαααααααΆαααααααΆαααΎα αα·ααααααααααΆααααααΉααααααααααΆααααΎααααΈαααααΎααααααα·ααΈααΆαα αααΎαα
ααααΎαααΆααααα½α
ααΎαααΈααα ααΎαααααΌαααΆαααΆαα»αααααααααΉα "ααααΆαα" αααααΆααααΆααααααΆααα αΌα αα·ααααααΌαααααααααΎααΆααα’αααα ααΆααα’ααααααααααΆαααααΉαααααΌαα http.Server α’αΆα αααααααΆααααΆαααΆααααα½αααΆαα½αααΉααα·α αα ααΆααααα
ααΆααααααααααααα αΆαααΆαααΆαααΈαααααα½ααα»αααααΌαα αααααα·α αα ααΆαααΆααα’αααααααΆααααααΉαααΆααααααααααααΆααααααΆααα ααΆα§ααΆα ααα αααααΊααααΎααΆαααΎαα·ααΈααΆα TLSα αααΆαααΈααα HTTP αααααααΆαααααΌαααΆαααααΎααΎααααΈα’αα»ααααααΆαα α http.ListenAndServer α
α₯α‘αΌααααααΌααααα‘ααααΎαα§ααΆα ααααααααα»αααααΆααααααααααα
ααΆααααααα 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 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 ααααααααΆαα½αααΉαααΆααααααα·ααααΆαααααααααααααααααααααα·α
ααΆαααααααααααΌαααααΆαααααα½α
αααααααααααΆαααΎααα½ααααα αΌααααα»ααααααΆααααααααααΆαααΊααα’ ααα»ααααααΆααΌαααααΆαααΆααα αααααα·ααΈααΆαα αααΎαααααΌαααΆαααααΌααααα»αααααΆαααΆα αα½αααΆααααααΌααααααΆαααααα»αααΌαααααΆα αα·ααα½α’αααααααα½α α¬ααΆααααααααααΆα αα·ααααΆαααΆααααααααααΌαα
αααα»αααααΈαααα’ααααα½αααααααΎαααα
αα
αααααΆααααααα±ααααΊααΆα―αααΆα 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 handler αα½αααΆαα½αα§αααααααααααααααααΌαααΆαααααΎ αααααααΎα±ααααΆα’αΆα α’αα»ααααααΆααααααααααΆαα ααΆααααα αΆαα ααΆααααααααΆ αα·ααα»αααΆααα½αα ααα½αααααααααααΆααααΆαααΆαααα ααα
ααΆα§ααΆα ααα α αΌαααΎααα·α αΆαααΆααΎα ααα»α αααααΆαα 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)
})
}
ααΆααααααααααΆααΈααΈααΈααΌα ααΆ ααΈ αααα’αα»ααααΆαα±ααα’ααααααααΈααα»αααΆαααααααΎαααΆαααααα·ααααααα
ααααΎααΆαααΆαα½αα―αααΆααα·αα·αααα
αααααΆααααααααααΆααααα 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 () α αααΆαααΈαααααααΌαααΆαα αΆααααααΎααα αααα»α goroutine α αΎααααααΆααααααΆαααααααΌαααΆαααααΆααααΎααααΈααα½αααΆααααααΆααααΆαα αααΆαααΆαααααΆααααΌαααΆαααα½α ααααααΆαααΈαααααΉααα·α ααα»αααααα·αααααΆαααα ααα»αααααααααΆααααΈααΈαααΈαα·ααΆααΈα
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" .- αααααα·ααααΆααΆαα’ααΈαααΊαα·α
"Profession Java Developer" .- αααααα·ααααΆααΆαααααααααααΆα
"α’αααα’αα·αααααα PHP ααΈ 0 ααα PRO" .
ααααα: www.habr.com