เชชเชพเชเช เชตเชฐเซเชท เชชเชนเซเชฒเชพเช เชฎเซเช เชถเชฐเซเชเชค เชเชฐเซ เชนเชคเซ
เช เชฒเซเช Go เชฎเชพเช เชธเชฐเซเชตเชฐ เชฒเชเชตเชพ เชตเชฟเชถเซ เชเซ. เชเชพเชฒเซ "เชนเซเชฒเซ เชตเชฐเซเชฒเซเชก!" เชเซเชตเซ เชธเชฐเชณ เชตเชธเซเชคเซเชเชฅเซ เชถเชฐเซเชเชค เชเชฐเซเช เช เชจเซ เชจเซเชเซเชจเซ เชเซเชทเชฎเชคเชพเช เชธเชพเชฅเซเชจเซ เชเชชเซเชฒเชฟเชเซเชถเชจ เชธเชพเชฅเซ เชธเชฎเชพเชชเซเชค เชเชฐเซเช:
- HTTPS เชฎเชพเชเซ เชฒเซเชเซเชธ เชเชจเซเชเซเชฐเชฟเชชเซเชเชจเซ เชเชชเชฏเซเช เชเชฐเชตเซ.
โ API เชฐเชพเชเชเชฐ เชคเชฐเซเชเซ เชเชพเชฎ เชเชฐเชตเซเช.
- เชฎเชฟเชกเชฒเชตเซเชฐ เชธเชพเชฅเซ เชเชพเชฎ เชเชฐเชตเซเช.
- เชธเซเชฅเชฟเชฐ เชซเชพเชเชฒเซเชจเซ เชชเซเชฐเชเซเชฐเชฟเชฏเชพ.
- เชฏเซเชเซเชฏ เชถเชเชกเชพเชเชจ.
เชธเซเชเชฟเชฒเชฌเซเชเซเชธ เชญเชฒเชพเชฎเชฃ เชเชฐเซ เชเซ: เชชเซเชฐเซเชเซเชเชฟเชเชฒ เชเซเชฐเซเชธ
"เชถเชฐเซเชเชคเชฅเซ เชชเชพเชฏเชฅเซเชจ เชกเซเชตเชฒเชชเชฐ" .เช เชฎเซ เชฏเชพเชฆ เชเชฐเชพเชตเซเช เชเซเช: Habrเชจเชพ เชคเชฎเชพเชฎ เชตเชพเชเชเซ เชฎเชพเชเซ - Habr เชชเซเชฐเซเชฎเซ เชเซเชกเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชเซเชเชชเชฃ เชธเซเชเชฟเชฒเชฌเซเชเซเชธ เชเซเชฐเซเชธเชฎเชพเช เชจเซเชเชงเชฃเซ เชเชฐเชคเซ เชตเชเชคเซ 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)
}
เช เชชเชเซ, เชเซ เชคเชฎเซ เชเชชเซเชฒเชฟเชเซเชถเชจ เชเชฒเชพเชตเซ เช
เชจเซ เชชเซเช เชเซเชฒเซ
เช เชฎเซ เชชเชเซเชฅเซ เชเชฃเซ เชตเชเชค เชนเซเชจเซเชกเชฒเชฐเชจเซ เชเชชเชฏเซเช เชเชฐเซเชถเซเช, เชชเชฐเชเชคเซ เชชเชนเซเชฒเชพ เชธเชฎเชเซเช เชเซ เชฌเชงเซเช เชเซเชตเซ เชฐเซเชคเซ เชเชพเชฐเซเชฏ เชเชฐเซ เชเซ.
เชจเซเช/http
เชเชฆเชพเชนเชฐเชฃ เชชเซเชเซเชเชจเซ เชเชชเชฏเซเช เชเชฐเซ เชเซ net/http
HTTP เชนเซเชจเซเชกเชฒเชฐเซเชธ
เชเซเชฏเชพเชฐเซ เช เชฎเชจเซ เชตเชฟเชจเชเชคเซ เชฎเชณเซ เชเซ, เชคเซเชฏเชพเชฐเซ เชนเซเชจเซเชกเชฒเชฐ เชคเซเชจเซเช เชตเชฟเชถเซเชฒเซเชทเชฃ เชเชฐเซ เชเซ เช เชจเซ เชชเซเชฐเชคเชฟเชญเชพเชต เชเชจเชฐเซเช เชเชฐเซ เชเซ. Go เชฎเชพเช เชนเซเชจเซเชกเชฒเชฐเซเชธ เชจเซเชเซ เชชเซเชฐเชฎเชพเชฃเซ เชฒเชพเชเซ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ:
type Handler interface {
ServeHTTP(ResponseWriter, *Request)
}
เชชเซเชฐเชฅเชฎ เชเชฆเชพเชนเชฐเชฃ http.HandleFunc เชนเซเชฒเซเชชเชฐ เชซเชเชเซเชถเชจเชจเซ เชเชชเชฏเซเช เชเชฐเซ เชเซ. เชคเซ เชฌเซเชเชพ เชซเชเชเซเชถเชจเชจเซ เชฒเชชเซเชเซ เชฒเซ เชเซ, เชเซ เชฌเชฆเชฒเชพเชฎเชพเช http.ResponseWriter เช เชจเซ http.Request เชจเซ ServeHTTP เชฎเชพเช เชฒเซ เชเซ.
เชฌเซเชเชพ เชถเชฌเซเชฆเซเชฎเชพเช เชเชนเซเช เชคเซ, เชเซเชฒเชพเชเชเชฎเชพเช เชนเซเชจเซเชกเชฒเชฐเซเชธ เชเช เช เชเชจเซเชเชฐเชซเซเชธเชฎเชพเช เชฐเชเซ เชฅเชพเชฏ เชเซ, เชเซ เชชเซเชฐเซเชเซเชฐเชพเชฎเชฐเชจเซ เชเชฃเชพ เชฌเชงเชพ เชตเชฟเชเชฒเซเชชเซ เชเชชเซ เชเซ. เชคเซเชฅเซ, เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, เชฎเชฟเชกเชฒเชตเซเชฐเชจเซ เชนเซเชจเซเชกเชฒเชฐเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เช เชฎเชฒเชฎเชพเช เชฎเซเชเชตเชพเชฎเชพเช เชเชตเซ เชเซ, เชเซเชฏเชพเช ServeHTTP เชชเชนเซเชฒเชพ เชเชเชเช เชเชฐเซ เชเซ เช เชจเซ เชชเชเซ เชฌเซเชเชพ เชนเซเชจเซเชกเชฒเชฐเชจเซ ServeHTTP เชชเชฆเซเชงเชคเชฟเชจเซ เชเซเชฒ เชเชฐเซ เชเซ.
เชเชชเชฐ เชธเซเชเชตเซเชฏเชพ เชฎเซเชเชฌ, เชนเซเชจเซเชกเชฒเชฐเซเชธ เชซเชเซเชค เชตเชฟเชจเชเชคเซเชเชจเซ เชชเซเชฐเชคเชฟเชธเชพเชฆ เชเชจเชฐเซเช เชเชฐเซ เชเซ. เชชเชฐเชเชคเซ เชเซเชเซเชเชธ เชธเชฎเชฏเซ เชเชฏเชพ เชเซเชเซเชเชธ เชนเซเชจเซเชกเชฒเชฐเชจเซ เชเชชเชฏเซเช เชเชฐเชตเซ เชเซเชเช?
เชฐเซเชเซเชเชเชจเซ เชตเชฟเชจเชเชคเซ เชเชฐเซ
เชฏเซเชเซเชฏ เชชเชธเชเชฆเชเซ เชเชฐเชตเชพ เชฎเชพเชเซ, HTTP เชฎเชฒเซเชเชฟเชชเซเชฒเซเชเซเชธเชฐเชจเซ เชเชชเชฏเซเช เชเชฐเซ. เชธเชเชเซเชฏเชพเชฌเชเชง เชชเซเชธเซเชคเชเชพเชฒเชฏเซเชฎเชพเช เชคเซเชจเซ เชฎเชเซเชธเชฐ เช เชฅเชตเชพ เชฐเชพเชเชเชฐ เชเชนเซเชตเชพเชฎเชพเช เชเชตเซ เชเซ, เชชเชฐเชเชคเซ เชคเซ เชฌเชงเซ เชธเชฎเชพเชจ เชตเชธเซเชคเซ เชเซ. เชฎเชฒเซเชเชฟเชชเซเชฒเซเชเซเชธเชฐเชจเซเช เชเชพเชฐเซเชฏ เชตเชฟเชจเชเชคเซ เชชเชพเชฅเชจเซเช เชตเชฟเชถเซเชฒเซเชทเชฃ เชเชฐเชตเชพเชจเซเช เช เชจเซ เชฏเซเชเซเชฏ เชนเซเชจเซเชกเชฒเชฐ เชชเชธเชเชฆ เชเชฐเชตเชพเชจเซเช เชเซ.
เชเซ เชคเชฎเชจเซ เชเชเชฟเชฒ เชฐเซเชเซเชเช เชฎเชพเชเซ เชธเชฎเชฐเซเชฅเชจเชจเซ เชเชฐเซเชฐ เชนเซเชฏ, เชคเซ เชคเซเชคเซเชฏ-เชชเชเซเชท เชชเซเชธเซเชคเชเชพเชฒเชฏเซเชจเซ เชเชชเชฏเซเช เชเชฐเชตเซ เชตเชงเซ เชธเชพเชฐเซเช เชเซ. เชเซเชเชฒเชพเช เชธเซเชฅเซ เช
เชฆเซเชฏเชคเชจ -
เชธเชพเชฎเชพเชจเซเชฏ เชชเชฐเชฟเชธเซเชฅเชฟเชคเชฟเชฎเชพเช เชเชเชฟเชฒ เชซเซเชฐเซเชฎเชตเชฐเซเช เชธเชพเชฅเซ เชเชพเชฎ เชเชฐเชตเชพ เชฎเชพเชเซ เชฌเชฟเชจ-เชฎเชพเชจเช เชเชเซเชฒเซเชจเซ เชเชฐเซเชฐ เชชเชกเชถเซ, เช เชจเซ เช เชกเชฟเชซเซเชฒเซเช เชนเซเชจเซเชกเชฒเชฐเซเชธเชจเชพ เชเชชเชฏเซเชเชจเซ เชจเซเชเชงเชชเชพเชคเซเชฐ เชฐเซเชคเซ เชเชเชฟเชฒ เชฌเชจเชพเชตเซ เชเซ. เชฎเซเชเชพเชญเชพเชเชจเซ เชเชชเซเชฒเชฟเชเซเชถเชจเซ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชเซ, เชกเชฟเชซเซเชฒเซเช เชฒเชพเชเชฌเซเชฐเซเชฐเซ เช เชจเซ เชเช เชธเชฐเชณ เชฐเชพเชเชเชฐเชจเซเช เชธเชเชฏเซเชเชจ เชชเซเชฐเชคเซเช เชนเชถเซ.
เชเซเชตเซเชฐเซ เชชเซเชฐเซเชธเซเชธเชฟเชเช
เชตเชงเซเชฎเชพเช, เช เชฎเชจเซ เชเช เชเชเชเชจเซ เชเชฐเซเชฐ เชเซ เชเซ เชเชตเชจเชพเชฐเชพ เชเชจเซเชเซเชถเชจเซเชธ เชฎเชพเชเซ "เชธเชพเชเชญเชณเชถเซ" เช เชจเซ เชฌเชงเซ เชตเชฟเชจเชเชคเซเชเชจเซ เชฏเซเชเซเชฏ เชนเซเชจเซเชกเชฒเชฐ เชชเชฐ เชฐเซเชกเชพเชฏเชฐเซเชเซเช เชเชฐเชถเซ. http.Server เช เชเชพเชฐเซเชฏเชจเซ เชธเชฐเชณเชคเชพเชฅเซ เชนเซเชจเซเชกเชฒ เชเชฐเซ เชถเชเซ เชเซ.
เชจเซเชเซ เชฆเชฐเซเชถเชพเชตเซเชฒ เชเซ เชเซ เชธเชฐเซเชตเชฐ เชเชจเซเชเซเชถเชจ เชชเซเชฐเซเชธเซเชธเชฟเชเชเชฅเซ เชธเชเชฌเชเชงเชฟเชค เชคเชฎเชพเชฎ เชเชพเชฐเซเชฏเซ เชฎเชพเชเซ เชเชตเชพเชฌเชฆเชพเชฐ เชเซ. เช, เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, TLS เชชเซเชฐเซเชเซเชเซเชฒเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชเชพเชฎ เชเชฐเซ เชเซ. http.ListenAndServer เชเซเชฒเชจเซ เช เชฎเชฒเชฎเชพเช เชฎเซเชเชตเชพ เชฎเชพเชเซ, เชชเซเชฐเชฎเชพเชฃเชญเซเชค HTTP เชธเชฐเซเชตเชฐเชจเซ เชเชชเชฏเซเช เชฅเชพเชฏ เชเซ.
เชนเชตเซ เชเชพเชฒเซ เชตเชงเซ เชเชเชฟเชฒ เชเชฆเชพเชนเชฐเชฃเซ เชเซเชเช.
เชเชพเชฒเซ เชเชจเซเชเซเชฐเชฟเชชเซเช เชเชฎเซเชฐเซ เชฐเชนเซเชฏเชพ เชเซเช
เชฎเซเชณเชญเซเชค เชฐเซเชคเซ, เช เชฎเชพเชฐเซ เชเชชเซเชฒเชฟเชเซเชถเชจ HTTP เชชเซเชฐเซเชเซเชเซเชฒ เชชเชฐ เชเชพเชฒเซ เชเซ, เชชเชฐเชเชคเซ HTTPS เชชเซเชฐเซเชเซเชเซเชฒเชจเซ เชเชชเชฏเซเช เชเชฐเชตเชพเชจเซ เชญเชฒเชพเชฎเชฃ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ. เช Go เชฎเชพเช เชธเชฎเชธเซเชฏเชพเช เชตเชฟเชจเชพ เชเชฐเซ เชถเชเชพเชฏ เชเซ. เชเซ เชคเชฎเชจเซ เชชเซเชฐเชฎเชพเชฃเชชเชคเซเชฐ เช เชจเซ เชเชพเชจเชเซ เชเซ เชชเซเชฐเชพเชชเซเชค เชฅเช เชนเซเชฏ, เชคเซ เชคเซ เชฏเซเชเซเชฏ เชชเซเชฐเชฎเชพเชฃเชชเชคเซเชฐ เช เชจเซ เชเซ เชซเชพเชเชฒเซ เชธเชพเชฅเซ ListenAndServeTLS เชจเซ เชจเซเชเชงเชฃเซ เชเชฐเชตเชพ เชฎเชพเชเซ เชชเซเชฐเชคเซเช เชเซ.
http.ListenAndServeTLS(":443", "cert.pem", "key.pem", nil)
เชคเชฎเซ เชนเชเชฎเซเชถเชพ เชตเชงเซ เชธเชพเชฐเซเช เชเชฐเซ เชถเชเซ เชเซ.
autocert
.
เชคเซเชจเซ เชฐเซเชชเชฐเซเชเชพเชเชเชฟเชค เชเชฐเชตเชพเชจเซ เชธเซเชฅเซ เชธเชนเซเชฒเซ เชฐเชธเซเชคเซ http.Serve เชธเชพเชฅเซ เชธเชเชฏเซเชเชจเชฎเชพเช autocert.NewListener เชชเชฆเซเชงเชคเชฟเชจเซ เชเชชเชฏเซเช เชเชฐเชตเชพเชจเซ เชเซ. เชเซเชฏเชพเชฐเซ HTTP เชธเชฐเซเชตเชฐ เชตเชฟเชจเชเชคเซเช เชชเชฐ เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชเชฐเซ เชเซ เชคเซเชฏเชพเชฐเซ เชชเชฆเซเชงเชคเชฟ เชคเชฎเชจเซ TLS เชชเซเชฐเชฎเชพเชฃเชชเชคเซเชฐเซ เชฎเซเชณเชตเชตเชพ เช เชจเซ เช เชชเชกเซเช เชเชฐเชตเชพเชจเซ เชฎเชเชเซเชฐเซ เชเชชเซ เชเซ:
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 เชฎเชพเชเซเชจเชพ เชฐเซเชเซเชธ เชงเชฐเชพเชตเชคเซ 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/ เชเชชเชธเชฐเซเช เชนเซเช เชณ เช เชฎเชพเชฐเชพ เชฎเซเชเซเชฏ เชฐเชพเชเชเชฐ เชชเชฐ เชฎเชพเชเชจเซเช เชเชฐเซ เชถเชเซเช เชเซเช:
// 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())
เชเชเชฟเชฒ เชฎเชพเชฐเซเชเซ เชธเชพเชฅเซ เชเชพเชฎ เชเชฐเชตเชพเชจเซ เชเซเชจเซ เชธเชฐเชณเชคเชพ เชฎเซเชเชพ, เชเชเชฟเชฒ เชเชชเซเชฒเชฟเชเซเชถเชจเซเชจเซ เชฐเชเชจเชพ เช เชจเซ เชเชพเชณเชตเชฃเซเชจเซ เชธเชฐเชณ เชฌเชจเชพเชตเชตเชพเชจเซเช เชถเชเซเชฏ เชฌเชจเชพเชตเซ เชเซ.
เชฎเชฟเชกเชฒเชตเซเชฐ เชธเชพเชฅเซ เชเชพเชฎ เชเชฐเชตเซเช
เชธเซเชเซเชเซเชเชเชฎเชพเช เชเช 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, เชเซ เชคเชฎเชจเซ เชฎเชฟเชกเชฒเชตเซเชฐ เชเชพเชฐเซเชฏเชเซเชทเชฎเชคเชพเชจเซ เชตเชฟเชธเซเชคเชพเชฐเชตเชพ เชฆเซ เชเซ.
เชธเซเชฅเชฟเชฐ เชซเชพเชเชฒเซ เชธเชพเชฅเซ เชเชพเชฎ เชเชฐเชตเซเช
เชเซ เชธเซเชเชพเชจเซเชกเชฐเซเชก เชฒเชพเชเชฌเซเชฐเซเชฐเซเชฎเชพเช เชเชฌเซเช, 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
เชฏเซเชเซเชฏ เชถเชเชกเชพเชเชจ
เชเซเชฎเชพเช HTTP เชธเชฐเซเชตเชฐเชจเซเช เชเซเชฐเซเชธเชซเซเชฒ เชถเชเชกเชพเชเชจ เชจเชพเชฎเชจเซ เชธเซเชตเชฟเชงเชพ เชชเชฃ เชเซ. เช เชถเชเชกเชพเชเชจ() เชชเชฆเซเชงเชคเชฟเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชเชฐเซ เชถเชเชพเชฏ เชเซ. เชธเชฐเซเชตเชฐ เชเซเชฐเซเชเซเชจเชฎเชพเช เชถเชฐเซ เชฅเชพเชฏ เชเซ, เช เชจเซ เชชเชเซ เชเซเชจเชฒเชจเซ เชเชจเซเชเชฐเชชเซเช เชธเชฟเชเซเชจเชฒ เชชเซเชฐเชพเชชเซเชค เชเชฐเชตเชพ เชฎเชพเชเซ เชธเชพเชเชญเชณเชตเชพเชฎเชพเช เชเชตเซ เชเซ. เชเชฒเชฆเซ เชธเชฟเชเซเชจเชฒ เชชเซเชฐเชพเชชเซเชค เชฅเชพเชฏ เชเซ, เชธเชฐเซเชตเชฐ เชฌเชเชง เชฅเชพเชฏ เชเซ, เชชเชฐเชเชคเซ เชคเชฐเชค เช เชจเชนเซเช, เชชเชฐเชเชคเซ เชฅเซเชกเซ เชธเซเชเชเชก เชชเชเซ.
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)
เชจเชฟเชทเซเชเชฐเซเชท เชคเชฐเซเชเซ
เชเซ เชฒเชเชญเช เชธเชพเชฐเซเชตเชคเซเชฐเชฟเช เชชเซเชฐเชฎเชพเชฃเชญเซเชค เชชเซเชธเซเชคเชเชพเชฒเชฏ เชธเชพเชฅเซเชจเซ เชถเชเซเชคเชฟเชถเชพเชณเซ เชญเชพเชทเชพ เชเซ. เชคเซเชจเซ เชกเชฟเชซเซเชฒเซเช เชเซเชทเชฎเชคเชพเช เชเซเชฌ เชตเชฟเชถเชพเชณ เชเซ, เช เชจเซ เชคเซเชจเซ เชเชจเซเชเชฐเชซเซเชธเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชตเชงเชพเชฐเซ เชถเชเชพเชฏ เชเซ - เช เชคเชฎเชจเซ เชเชฐเซเชเชฐ เชตเชฟเชถเซเชตเชธเชจเซเชฏ HTTP เชธเชฐเซเชตเชฐเซเชธ เชตเชฟเชเชธเชพเชตเชตเชพ เชฎเชพเชเซ เชชเชฐเชตเชพเชจเชเซ เชเชชเซ เชเซ.
เชธเซเชเชฟเชฒเชฌเซเชเซเชธ เชญเชฒเชพเชฎเชฃ เชเชฐเซ เชเซ:
- เชฌเซ เชตเชฐเซเชทเชจเซ เชชเซเชฐเซเชเซเชเชฟเชเชฒ เชเซเชฐเซเชธ
"เชนเซเช เชชเซเชฐเซ เชตเซเชฌ เชกเซเชตเชฒเชชเชฐ เชเซเช" .- เชถเซเชเซเชทเชฃเชฟเช เชเชจเชฒเชพเชเชจ เชเซเชฐเซเชธ
"เชชเซเชฐเซเชซเซเชถเชจ เชเชพเชตเชพ เชกเซเชตเชฒเชชเชฐ" .- เชเช เชตเชฐเซเชทเชจเซ เชชเซเชฐเซเชเซเชเชฟเชเชฒ เชเซเชฐเซเชธ
"0 เชฅเซ PRO เชธเซเชงเซ PHP เชตเชฟเชเชพเชธเชเชฐเซเชคเชพ" .
เชธเซเชฐเซเชธ: www.habr.com