เด
เดเตเดเต เดตเตผเดทเด เดฎเตเดฎเตเดชเต เดเดพเตป เดคเตเดเดเตเดเดฟ
เด เดฒเตเดเดจเด 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 เดธเดนเดพเดฏเดฟ เดซเดเดเตเดทเตป เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจเต. เดเดคเต เดฎเดฑเตเดฑเตเดฐเต เดซเดเดเตโเดทเตป เดชเตเดคเดฟเดฏเตเดจเตเดจเต, เด เดคเต ServeHTTP-เตฝ http.ResponseWriter, http.Request เดเดจเตเดจเดฟเดต เดธเตเดตเตเดเดฐเดฟเดเตเดเตเดจเตเดจเต.
เดฎเดฑเตเดฑเตเดฐเต เดตเดฟเดงเดคเตเดคเดฟเตฝ เดชเดฑเดเตเดเดพเตฝ, เดเตเดฒเดพเดเตเดเดฟเดฒเต เดนเดพเตปเดกเตโเดฒเตผเดฎเดพเดฐเต เดเดฐเตเดฑเตเดฑ เดเดจเตเดฑเตผเดซเตเดธเต เดชเตเดฐเดคเดฟเดจเดฟเดงเตเดเดฐเดฟเดเตเดเตเดจเตเดจเต, เดเดคเต เดชเตเดฐเตเดเตเดฐเดพเดฎเตผเดเตเดเต เดงเดพเดฐเดพเดณเด เด เดตเดธเดฐเดเตเดเตพ เดจเตฝเดเตเดจเตเดจเต. เด เดคเดฟเดจเดพเตฝ, เดเดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดเดฐเต เดนเดพเตปเดกเตโเดฒเตผ เดเดชเดฏเตเดเดฟเดเตเดเดพเดฃเต เดฎเดฟเดกเดฟเตฝเดตเตเดฏเตผ เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเตเดจเตเดจเดคเต, เด เดตเดฟเดเต ServeHTTP เดเดฆเตเดฏเด เดเดจเตเดคเตเดเตเดเดฟเดฒเตเด เดเตเดฏเตเดฏเตเดเดฏเตเด เดคเตเดเตผเดจเตเดจเต เดฎเดฑเตเดฑเตเดฐเต เดนเดพเตปเดกเตโเดฒเดฑเดฟเดจเตเดฑเต ServeHTTP เดฐเตเดคเดฟ เดตเดฟเดณเดฟเดเตเดเตเดเดฏเตเด เดเตเดฏเตเดฏเตเดจเตเดจเต.
เดฎเตเดเดณเดฟเตฝ เดธเตเดเดฟเดชเตเดชเดฟเดเตเดเดคเตเดชเตเดฒเต, เดนเดพเตปเดกเตโเดฒเตผเดฎเดพเตผ เด เดญเตเดฏเตผเดคเตเดฅเดจเดเดณเตเดเตเดณเตเดณ เดชเตเดฐเดคเดฟเดเดฐเดฃเดเตเดเตพ เดฐเตเดชเดชเตเดชเตเดเตเดคเตเดคเตเดจเตเดจเต. เดเดจเตเดจเดพเตฝ เดเดฐเต เดชเตเดฐเดคเตเดฏเตเด เดธเดฎเดฏเดคเตเดคเต เดเดคเต เดนเดพเตปเดกเตโเดฒเตผ เดเดชเดฏเตเดเดฟเดเตเดเดฃเด?
เดฑเตเดเตเดเดฟเดเดเต เด เดญเตเดฏเตผเดคเตเดฅเดฟเดเตเดเตเด
เดถเดฐเดฟเดฏเดพเดฏ เดคเดฟเดฐเดเตเดเตเดเตเดชเตเดชเต เดจเดเดคเตเดคเดพเตป, HTTP เดฎเตพเดเตเดเดฟเดชเตเดฒเดเตโเดธเตผ เดเดชเดฏเตเดเดฟเดเตเดเตเด. เดจเดฟเดฐเดตเดงเดฟ เดฒเตเดฌเตเดฐเดฑเดฟเดเดณเดฟเตฝ เดเดคเดฟเดจเต เดฎเดเตโเดธเตผ เด เดฒเตเดฒเตเดเตเดเดฟเตฝ เดฑเตเดเตเดเตผ เดเดจเตเดจเต เดตเดฟเดณเดฟเดเตเดเตเดจเตเดจเต, เดชเดเตเดทเต เด เดตเดฏเตเดฒเตเดฒเดพเด เดเดจเตเดจเตเดคเดจเตเดจเตเดฏเดพเดฃเต. เด เดญเตเดฏเตผเดคเตเดฅเดจ เดชเดพเดค เดตเดฟเดถเดเดฒเดจเด เดเตเดฏเตเดฏเตเดเดฏเตเด เดเดเดฟเดคเดฎเดพเดฏ เดนเดพเตปเดกเตโเดฒเตผ เดคเดฟเดฐเดเตเดเตเดเตเดเตเดเตเดเดฏเตเด เดเตเดฏเตเดฏเตเด เดเดจเตเดจเดคเดพเดฃเต เดฎเตพเดเตเดเดฟเดชเตเดฒเดเตโเดธเดฑเดฟเดจเตเดฑเต เดชเตเดฐเดตเตผเดคเตเดคเดจเด.
เดธเดเตเดเตเตผเดฃเตเดฃเดฎเดพเดฏ เดฑเตเดเตเดเดฟเดเดเดฟเดจเต เดจเดฟเดเตเดเตพเดเตเดเต เดชเดฟเดจเตเดคเตเดฃ เดเดตเดถเตเดฏเดฎเตเดฃเตเดเตเดเตเดเดฟเตฝ, เดฎเตเดจเตเดจเดพเด เดเดเตเดทเดฟ เดฒเตเดฌเตเดฐเดฑเดฟเดเตพ เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจเดคเดพเดฃเต เดจเดฒเตเดฒเดคเต. เดเดฑเตเดฑเดตเตเด เดชเตเดฐเตเดเดฎเดฟเดเตเด เดเดจเตเดจเต
เดเดฐเต เดธเดพเดงเดพเดฐเดฃ เดธเดพเดนเดเดฐเตเดฏเดคเตเดคเดฟเตฝ เดธเดเตเดเตเตผเดฃเตเดฃเดฎเดพเดฏ เดเดเตเดเดเตเดเตเดเตเดเดณเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเต เดคเดฟเดเดเตเดเตเด เดธเตเดฑเตเดฑเดพเตปเดกเตเตผเดกเต เดธเตเดฒเตเดฏเตเดทเดจเตเดเตพ เดเดตเดถเตเดฏเดฎเดฟเดฒเตเดฒ, เดเดคเต เดกเดฟเดซเตเตพเดเตเดเต เดนเดพเตปเดกเตโเดฒเดฑเตเดเดณเตเดเต เดเดชเดฏเตเดเดคเตเดคเต เดตเดณเดฐเตเดฏเดงเดฟเดเด เดธเดเตเดเตเตผเดฃเตเดฃเดฎเดพเดเตเดเตเดจเตเดจเต. เดญเตเดฐเดฟเดญเดพเดเด เดเดชเตเดฒเดฟเดเตเดเตเดทเดจเตเดเดณเตเด เดธเตเดทเตเดเดฟเดเตเดเดพเตป เดกเดฟเดซเตเตพเดเตเดเต เดฒเตเดฌเตเดฐเดฑเดฟเดฏเตเดเตเดฏเตเด เดฒเดณเดฟเดคเดฎเดพเดฏ เดฑเตเดเตเดเดฑเดฟเดจเตเดฑเตเดฏเตเด เดธเดเดฏเตเดเดจเด เดฎเดคเดฟเดฏเดพเดเตเด.
เด เดจเตเดตเตเดทเดฃ เดชเตเดฐเตเดธเดธเตเดธเดฟเดเดเต
เดเตเดเดพเดคเต, เดเตปเดเดฎเดฟเดเดเต เดเดฃเดเตเดทเดจเตเดเตพเดเตเดเดพเดฏเดฟ "เดเตเตพเดเตเดเตเดจเตเดจเดคเตเด" เดเดฒเตเดฒเดพ เด เดญเตเดฏเตผเดคเตเดฅเดจเดเดณเตเด เดถเดฐเดฟเดฏเดพเดฏ เดนเดพเตปเดกเตเดฒเดฑเดฟเดฒเตเดเตเดเต เดฑเตเดกเดฏเดฑเดเตเดเต เดเตเดฏเตเดฏเตเดจเตเดจเดคเตเดฎเดพเดฏ เดเดฐเต เดเดเดเด เดเดเตเดเตพเดเตเดเต เดเดตเดถเตเดฏเดฎเดพเดฃเต. http.Server เดจเต เด เดเดพเดธเตเดเตเดเดฟเดจเต เดเดณเตเดชเตเดชเดคเตเดคเดฟเตฝ เดจเตเดฐเดฟเดเดพเตป เดเดดเดฟเดฏเตเด.
เดเดฃเดเตเดทเดจเตเดเตพ เดเตเดเดพเดฐเตเดฏเด เดเตเดฏเตเดฏเตเดจเตเดจเดคเตเดฎเดพเดฏเดฟ เดฌเดจเตเดงเดชเตเดชเตเดเตเด เดเดฒเตเดฒเดพ เดเตเดฒเดฟเดเตพเดเตเดเตเด เดธเตเตผเดตเดฑเดพเดฃเต เดเดคเตเดคเดฐเดตเดพเดฆเดฟเดฏเตเดจเตเดจเต เดเดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจเดต เดเดพเดฃเดฟเดเตเดเตเดจเตเดจเต. เดเดคเต, เดเดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, TLS เดชเตเดฐเตเดเตเดเตเดเตเดเตเดณเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเตเดจเตเดจเต. http.ListenAndServer เดเตเตพ เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเดพเตป เดเดฐเต เดธเดพเดงเดพเดฐเดฃ HTTP เดธเตเตผเดตเตผ เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจเต.
เดเดชเตเดชเตเตพ เดเตเดเตเดคเตฝ เดธเดเตเดเตเตผเดฃเตเดฃเดฎเดพเดฏ เดเดฆเดพเดนเดฐเดฃเดเตเดเตพ เดจเตเดเตเดเดพเด.
เดจเดฎเตเดเตเดเต เดเตปเดเตเดฐเดฟเดชเตเดฑเตเดฑเต เดเตเดฏเตเดฏเดพเด เดเดจเตเดจเต เดเตเตผเดเตเดเตเดจเตเดจเต
เดธเตเดฅเดฟเดฐเดธเตเดฅเดฟเดคเดฟเดฏเดพเดฏเดฟ, เดเดเตเดเดณเตเดเต เดเดชเตเดฒเดฟเดเตเดเตเดทเตป HTTP เดชเตเดฐเตเดเตเดเตเดเตเดเตเดณเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเตเดจเตเดจเต, เดชเดเตเดทเต HTTPS เดชเตเดฐเตเดเตเดเตเดเตเดเตเตพ เดเดชเดฏเตเดเดฟเดเตเดเดพเตป เดถเตเดชเดพเตผเดถ เดเตเดฏเตเดฏเตเดจเตเดจเต. เดเตเดฏเดฟเตฝ, เดเดคเต เดชเตเดฐเดถเตเดจเดเตเดเดณเดฟเดฒเตเดฒเดพเดคเต เดเตเดฏเตเดฏเดพเตป เดเดดเดฟเดฏเตเด. เดจเดฟเดเตเดเตพเดเตเดเต เดเดฐเต เดธเตผเดเตเดเดฟเดซเดฟเดเตเดเดฑเตเดฑเตเด เดเดฐเต เดธเตเดตเดเดพเดฐเตเดฏ เดเตเดฏเตเด เดฒเดญเดฟเดเตเดเดฟเดเตเดเตเดฃเตเดเตเดเตเดเดฟเตฝ, เดถเดฐเดฟเดฏเดพเดฏ เดธเตผเดเตเดเดฟเดซเดฟเดเตเดเดฑเตเดฑเตเด เดเต เดซเดฏเดฒเตเดเดณเตเด เดเดชเดฏเตเดเดฟเดเตเดเต 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())
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)
})
}
เดเดจเตเดฑเตผเดฎเตเดกเดฟเดฏเดฑเตเดฑเต เดชเตเดฐเตเดธเดธเตเดธเดฟเดเดเดฟเดจเตเดฑเต เดชเตเดฐเดตเตผเดคเตเดคเดจเด เดตเดฟเดชเตเดฒเตเดเดฐเดฟเดเตเดเดพเตป เดจเดฟเดเตเดเดณเต เด เดจเตเดตเดฆเดฟเดเตเดเตเดจเตเดจ เดเดฟ เดชเตเดฒเตเดณเตเดณ เดฎเตเดจเตเดจเดพเด เดเดเตเดทเดฟ เดฑเตเดเตเดเดฑเตเดเตพ เดเดฃเตเดเต.
เดธเตเดฑเตเดฑเดพเดฑเตเดฑเดฟเดเต เดซเดฏเดฒเตเดเดณเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเตเดจเตเดจเต
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
เดชเตเดฐเดงเดพเดจ index.html เดซเดฏเตฝ เด
เดเดเตเดเดฟเดฏเดฟเดเตเดเดฟเดฒเตเดฒเตเดเตเดเดฟเตฝ, http.Dir เดกเดฏเดฑเดเตเดเดฑเดฟเดฏเตเดเต เดเดณเตเดณเดเดเตเดเดเตเดเตพ เดชเตเดฐเดฆเตผเดถเดฟเดชเตเดชเดฟเดเตเดเตเดฎเตเดจเตเดจเต เดเตผเดฎเตเดฎเดฟเดเตเดเตเด. เด เดธเดพเดนเดเดฐเตเดฏเดคเตเดคเดฟเตฝ, เดกเดฏเดฑเดเตเดเดฑเดฟ เดตเดฟเดเตเดเตเดตเตเดดเตเด เดเตเดฏเตเดฏเดชเตเดชเตเดเดพเดคเดฟเดฐเดฟเดเตเดเดพเตป, เดจเดฟเดเตเดเตพ เดชเดพเดเตเดเตเดเต เดเดชเดฏเตเดเดฟเดเตเดเดฃเด unindexed
เดถเดฐเดฟเดฏเดพเดฏ เดทเดเตเดเตเดกเตเตบ
HTTP เดธเตเตผเดตเดฑเดฟเดจเตเดฑเต เดฎเดจเตเดนเดฐเดฎเดพเดฏ เดทเดเตเดเตเดกเตเตบ เดชเตเดฒเตเดฏเตเดณเตเดณ เดเดฐเต เดธเดตเดฟเดถเตเดทเดคเดฏเตเด Go-เดฏเดฟเดฒเตเดฃเตเดเต. เดทเดเตเดเตเดกเตเตบ() เดฐเตเดคเดฟ เดเดชเดฏเตเดเดฟเดเตเดเต เดเดคเต เดเตเดฏเตเดฏเดพเด. เดธเตเตผเดตเตผ เดเดฐเต เดเตเดฑเตเดเตเดเตเดจเดฟเตฝ เดเดฐเดเดญเดฟเดเตเดเต, เดคเตเดเตผเดจเตเดจเต เดเดฐเต เดคเดเดธเตเดธ เดธเดฟเดเตเดจเตฝ เดฒเดญเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเดพเดฏเดฟ เดเดพเดจเตฝ เดถเตเดฐเดฆเตเดงเดฟเดเตเดเตเดจเตเดจเต. เดธเดฟเดเตเดจเตฝ เดฒเดญเดฟเดเตเดเดฏเตเดเตป, เดธเตเตผเดตเตผ เดเดซเดพเดเตเด, เดชเดเตเดทเต เดเดเดจเดเดฟ เด เดฒเตเดฒ, เดเตเดฑเดเตเดเต เดจเดฟเดฎเดฟเดทเดเตเดเตพเดเตเดเต เดถเตเดทเด.
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 เดธเตเตผเดตเดฑเตเดเตพ เดตเดฟเดเดธเดฟเดชเตเดชเดฟเดเตเดเดพเตป เดจเดฟเดเตเดเดณเต เด เดจเตเดตเดฆเดฟเดเตเดเตเดจเตเดจเต.
เดธเตเดเดฟเตฝเดฌเตเดเตเดธเต เดถเตเดชเดพเตผเดถ เดเตเดฏเตเดฏเตเดจเตเดจเต:
- เดฐเดฃเตเดเตเดตเตผเดทเดคเตเดคเต เดชเตเดฐเดพเดเตเดเดฟเดเตเดเตฝ เดเตเดดเตเดธเต
"เดเดพเตป เดเดฐเต PRO เดตเตเดฌเต เดกเตเดตเดฒเดชเตเดชเตผ เดเดฃเต" .- เดตเดฟเดฆเตเดฏเดพเดญเตเดฏเดพเดธ เดเตบเดฒเตเตป เดเตเดดเตเดธเต
"เดชเตเดฐเตเดซเดทเตป เดเดพเดต เดกเตเดตเดฒเดชเตเดชเตผ" .- เดชเตเดฐเดพเดฏเตเดเดฟเด เดตเตผเดท เดเตเดดเตเดธเต
"0 เดฎเตเดคเตฝ PRO เดตเดฐเตเดฏเตเดณเตเดณ PHP เดกเดตเดฒเดชเตเดชเตผ" .
เด เดตเดฒเดเดฌเด: www.habr.com