เช—เซ‹เชฒเชพเช‚เช—เชฎเชพเช‚ เชตเซ‡เชฌ เชธเชฐเซเชตเชฐเชจเซ‹ เชตเชฟเช•เชพเชธ - เชธเชฐเชณเชฅเซ€ เชœเชŸเชฟเชฒ เชธเซเชงเซ€

เช—เซ‹เชฒเชพเช‚เช—เชฎเชพเช‚ เชตเซ‡เชฌ เชธเชฐเซเชตเชฐเชจเซ‹ เชตเชฟเช•เชพเชธ - เชธเชฐเชณเชฅเซ€ เชœเชŸเชฟเชฒ เชธเซเชงเซ€

เชชเชพเช‚เชš เชตเชฐเซเชท เชชเชนเซ‡เชฒเชพเช‚ เชฎเซ‡เช‚ เชถเชฐเซ‚เช†เชค เช•เชฐเซ€ เชนเชคเซ€ เช—เซ‹เชซเชฟเชถเชจเซ‹ เชตเชฟเช•เชพเชธ เช•เชฐเซ‹, เช†เชจเชพเชฅเซ€ เช—เซ‹เชฒเชพเช‚เช— เชถเซ€เช–เชตเชพเชจเซ€ เชคเช• เชฎเชณเซ€. เชฎเชจเซ‡ เชธเชฎเชœเชพเชฏเซเช‚ เช•เซ‡ เช—เซ‹ เชเช• เชถเช•เซเชคเชฟเชถเชพเชณเซ€ เชญเชพเชทเชพ เช›เซ‡, เชœเซ‡ เช˜เชฃเซ€ เชฒเชพเช‡เชฌเซเชฐเซ‡เชฐเซ€เช“ เชฆเซเชตเชพเชฐเชพ เชชเซ‚เชฐเช• เช›เซ‡. เช—เซ‹ เชฌเชนเซเชฎเซเช–เซ€ เช›เซ‡: เช–เชพเชธ เช•เชฐเซ€เชจเซ‡, เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เซ‹เชˆเชชเชฃ เชธเชฎเชธเซเชฏเชพ เชตเชฟเชจเชพ เชธเชฐเซเชตเชฐ-เชธเชพเช‡เชก เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเซ‹ เชตเชฟเช•เชธเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เชฅเชˆ เชถเช•เซ‡ เช›เซ‡.

เช† เชฒเซ‡เช– 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 เช•เซเชฒเชพเชฏเช‚เชŸ เชฌเช‚เชจเซ‡ เชตเชฟเช•เชธเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เช—เซ‹เชฎเชพเช‚ เชชเซเชฐเชพเชฅเชฎเชฟเช• เชธเชพเชงเชจ เช›เซ‡. เช•เซ‹เชกเชจเซ‡ เชธเชฎเชœเชตเชพ เชฎเชพเชŸเซ‡, เชšเชพเชฒเซ‹ เชคเซเชฐเชฃ เชฎเชนเชคเซเชตเชจเชพ เช˜เชŸเช•เซ‹เชจเซ‹ เช…เชฐเซเชฅ เชธเชฎเชœเซ€เช: http.Handler, http.ServeMux เช…เชจเซ‡ http.Server.

HTTP เชนเซ‡เชจเซเชกเชฒเชฐเซเชธ

เชœเซเชฏเชพเชฐเซ‡ เช…เชฎเชจเซ‡ เชตเชฟเชจเช‚เชคเซ€ เชฎเชณเซ‡ เช›เซ‡, เชคเซเชฏเชพเชฐเซ‡ เชนเซ‡เชจเซเชกเชฒเชฐ เชคเซ‡เชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เชชเซเชฐเชคเชฟเชญเชพเชต เชœเชจเชฐเซ‡เชŸ เช•เชฐเซ‡ เช›เซ‡. Go เชฎเชพเช‚ เชนเซ‡เชจเซเชกเชฒเชฐเซเชธ เชจเซ€เชšเซ‡ เชชเซเชฐเชฎเชพเชฃเซ‡ เชฒเชพเช—เซ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡:

type Handler interface {
        ServeHTTP(ResponseWriter, *Request)
}

เชชเซเชฐเชฅเชฎ เช‰เชฆเชพเชนเชฐเชฃ http.HandleFunc เชนเซ‡เชฒเซเชชเชฐ เชซเช‚เช•เซเชถเชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡. เชคเซ‡ เชฌเซ€เชœเชพ เชซเช‚เช•เซเชถเชจเชจเซ‡ เชฒเชชเซ‡เชŸเซ€ เชฒเซ‡ เช›เซ‡, เชœเซ‡ เชฌเชฆเชฒเชพเชฎเชพเช‚ http.ResponseWriter เช…เชจเซ‡ http.Request เชจเซ‡ ServeHTTP เชฎเชพเช‚ เชฒเซ‡ เช›เซ‡.

เชฌเซ€เชœเชพ เชถเชฌเซเชฆเซ‹เชฎเชพเช‚ เช•เชนเซ€เช เชคเซ‹, เช—เซ‹เชฒเชพเช‚เช—เชฎเชพเช‚ เชนเซ‡เชจเซเชกเชฒเชฐเซเชธ เชเช• เชœ เช‡เชจเซเชŸเชฐเชซเซ‡เชธเชฎเชพเช‚ เชฐเชœเซ‚ เชฅเชพเชฏ เช›เซ‡, เชœเซ‡ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฐเชจเซ‡ เช˜เชฃเชพ เชฌเชงเชพ เชตเชฟเช•เชฒเซเชชเซ‹ เช†เชชเซ‡ เช›เซ‡. เชคเซ‡เชฅเซ€, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชฎเชฟเชกเชฒเชตเซ‡เชฐเชจเซ‡ เชนเซ‡เชจเซเชกเชฒเชฐเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช…เชฎเชฒเชฎเชพเช‚ เชฎเซ‚เช•เชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เชœเซเชฏเชพเช‚ ServeHTTP เชชเชนเซ‡เชฒเชพ เช•เช‚เชˆเช• เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เชชเช›เซ€ เชฌเซ€เชœเชพ เชนเซ‡เชจเซเชกเชฒเชฐเชจเซ€ ServeHTTP เชชเชฆเซเชงเชคเชฟเชจเซ‡ เช•เซ‰เชฒ เช•เชฐเซ‡ เช›เซ‡.

เช‰เชชเชฐ เชธเซ‚เชšเชตเซเชฏเชพ เชฎเซเชœเชฌ, เชนเซ‡เชจเซเชกเชฒเชฐเซเชธ เชซเช•เซเชค เชตเชฟเชจเช‚เชคเซ€เช“เชจเซ‹ เชชเซเชฐเชคเชฟเชธเชพเชฆ เชœเชจเชฐเซ‡เชŸ เช•เชฐเซ‡ เช›เซ‡. เชชเชฐเช‚เชคเซ เชšเซ‹เช•เซเช•เชธ เชธเชฎเชฏเซ‡ เช•เชฏเชพ เชšเซ‹เช•เซเช•เชธ เชนเซ‡เชจเซเชกเชฒเชฐเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเซ‹ เชœเซ‹เชˆเช?

เชฐเซ‚เชŸเซ€เช‚เช—เชจเซ€ เชตเชฟเชจเช‚เชคเซ€ เช•เชฐเซ‹

เชฏเซ‹เช—เซเชฏ เชชเชธเช‚เชฆเช—เซ€ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, HTTP เชฎเชฒเซเชŸเชฟเชชเซเชฒเซ‡เช•เซเชธเชฐเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‹. เชธเช‚เช–เซเชฏเชพเชฌเช‚เชง เชชเซเชธเซเชคเช•เชพเชฒเชฏเซ‹เชฎเชพเช‚ เชคเซ‡เชจเซ‡ เชฎเช•เซเชธเชฐ เช…เชฅเชตเชพ เชฐเชพเช‰เชŸเชฐ เช•เชนเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เชชเชฐเช‚เชคเซ เชคเซ‡ เชฌเชงเซ€ เชธเชฎเชพเชจ เชตเชธเซเชคเซ เช›เซ‡. เชฎเชฒเซเชŸเชฟเชชเซเชฒเซ‡เช•เซเชธเชฐเชจเซเช‚ เช•เชพเชฐเซเชฏ เชตเชฟเชจเช‚เชคเซ€ เชชเชพเชฅเชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เช•เชฐเชตเชพเชจเซเช‚ เช…เชจเซ‡ เชฏเซ‹เช—เซเชฏ เชนเซ‡เชจเซเชกเชฒเชฐ เชชเชธเช‚เชฆ เช•เชฐเชตเชพเชจเซเช‚ เช›เซ‡.

เชœเซ‹ เชคเชฎเชจเซ‡ เชœเชŸเชฟเชฒ เชฐเซ‚เชŸเซ€เช‚เช— เชฎเชพเชŸเซ‡ เชธเชฎเชฐเซเชฅเชจเชจเซ€ เชœเชฐเซ‚เชฐ เชนเซ‹เชฏ, เชคเซ‹ เชคเซƒเชคเซ€เชฏ-เชชเช•เซเชท เชชเซเชธเซเชคเช•เชพเชฒเชฏเซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเซ‹ เชตเชงเซ เชธเชพเชฐเซเช‚ เช›เซ‡. เช•เซ‡เชŸเชฒเชพเช• เชธเซŒเชฅเซ€ เช…เชฆเซเชฏเชคเชจ - เช—เซ‹เชฐเซ€เชฒเชพ/เชฎเช•เซเชธ ะธ เช—เซ‹-เชšเซ€/เชšเซ€, เช† เชชเซเชธเซเชคเช•เชพเชฒเชฏเซ‹ เช•เซ‹เชˆเชชเชฃ เชธเชฎเชธเซเชฏเชพ เชตเชฟเชจเชพ เชฎเชงเซเชฏเชตเชฐเซเชคเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชจเซ‡ เช…เชฎเชฒเชฎเชพเช‚ เชฎเซ‚เช•เชตเชพเชจเซเช‚ เชถเช•เซเชฏ เชฌเชจเชพเชตเซ‡ เช›เซ‡. เชคเซ‡เชฎเชจเซ€ เชธเชนเชพเชฏเชฅเซ€, เชคเชฎเซ‡ เชตเชพเช‡เชฒเซเชกเช•เชพเชฐเซเชก เชฐเซ‚เชŸเซ€เช‚เช—เชจเซ‡ เช—เซ‹เช เชตเซ€ เชถเช•เซ‹ เช›เซ‹ เช…เชจเซ‡ เชธเช‚เช–เซเชฏเชพเชฌเช‚เชง เช…เชจเซเชฏ เช•เชพเชฐเซเชฏเซ‹ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹. เชคเซ‡เชฎเชจเซ‹ เชซเชพเชฏเชฆเซ‹ เชชเซเชฐเชฎเชพเชฃเชญเซ‚เชค 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)

เชœเซ‹ เช†เชชเชฃเซ‡ เชฌเซเชฐเชพเช‰เชเชฐเชฎเชพเช‚ เช“เชชเชจ เช•เชฐเซ€เช example.com, เช…เชฎเชจเซ‡ HTTPS เชชเซเชฐเชคเชฟเชธเชพเชฆ "เชนเซ‡เชฒเซ‹, เชตเชฐเซเชฒเซเชก!" เชชเซเชฐเชพเชชเซเชค เชฅเชถเซ‡.

เชœเซ‹ เชคเชฎเชจเซ‡ เชตเชงเซ เชตเชฟเช—เชคเชตเชพเชฐ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจเชจเซ€ เชœเชฐเซ‚เชฐ เชนเซ‹เชฏ, เชคเซ‹ เชคเชฎเชพเชฐเซ‡ 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 เชธเชฐเซเชตเชฐเซเชธ เชตเชฟเช•เชธเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เชชเชฐเชตเชพเชจเช—เซ€ เช†เชชเซ‡ เช›เซ‡.

เชธเซเช•เชฟเชฒเชฌเซ‹เช•เซเชธ เชญเชฒเชพเชฎเชฃ เช•เชฐเซ‡ เช›เซ‡:

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹