
āĻĒāĻžāĻāĻ āĻŦāĻāϰ āĻāĻā§ āĻļā§āϰ⧠āĻāϰā§āĻāĻŋāϞāĻžāĻŽ , āĻāĻāĻŋ āĻā§āϞāĻ āĻļā§āĻāĻžāϰ āϏā§āϝā§āĻ āĻāϰ⧠āĻĻāĻŋāϝāĻŧā§āĻā§āĨ¤ āĻāĻŽāĻŋ āĻŦā§āĻāϤ⧠āĻĒā§āϰā§āĻāĻŋ āϝ⧠āĻā§ āĻāĻāĻāĻŋ āĻļāĻā§āϤāĻŋāĻļāĻžāϞ⧠āĻāĻžāώāĻž, āĻ
āύā§āĻ āϞāĻžāĻāĻŦā§āϰā§āϰāĻŋ āĻĻā§āĻŦāĻžāϰāĻž āĻĒāϰāĻŋāĻĒā§āϰāĻāĨ¤ Go āĻŦāĻšā§āĻŽā§āĻā§: āĻŦāĻŋāĻļā§āώ āĻāϰā§, āĻāĻāĻŋ āĻā§āύ⧠āϏāĻŽāϏā§āϝāĻž āĻāĻžāĻĄāĻŧāĻžāĻ āϏāĻžāϰā§āĻāĻžāϰ-āϏāĻžāĻāĻĄ āĻ
ā§āϝāĻžāĻĒā§āϞāĻŋāĻā§āĻļāύ āĻŦāĻŋāĻāĻžāĻļ āĻāϰāϤ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰā§āĨ¤
āĻāĻ āύāĻŋāĻŦāύā§āϧāĻāĻŋ Go-āϤ⧠āĻāĻāĻāĻŋ āϏāĻžāϰā§āĻāĻžāϰ āϞā§āĻāĻžāϰ āĻŦāĻŋāώāϝāĻŧā§āĨ¤ āĻāϏā§āύ "āĻšā§āϝāĻžāϞ⧠āĻāϝāĻŧāĻžāϰā§āϞā§āĻĄ!" āĻāϰ āĻŽāϤ⧠āϏāĻžāϧāĻžāϰāĻŖ āĻāĻŋāύāĻŋāϏ āĻĻāĻŋāϝāĻŧā§ āĻļā§āϰ⧠āĻāϰāĻŋ āĻāĻŦāĻ āύāĻŋāĻŽā§āύāϞāĻŋāĻāĻŋāϤ āĻā§āώāĻŽāϤāĻž āϏāĻš āĻāĻāĻāĻŋ āĻ ā§āϝāĻžāĻĒā§āϞāĻŋāĻā§āĻļāύ āĻĻāĻŋāϝāĻŧā§ āĻļā§āώ āĻāϰāĻŋ:
- āϞā§āĻāϏ āĻāύāĻā§āϰāĻŋāĻĒā§āĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠HTTPS āĻāϰ āĻāύā§āϝāĨ¤
â āĻāĻĒāĻŋāĻāĻ āϰāĻžāĻāĻāĻžāϰ āĻšāĻŋāϏā§āĻŦā§ āĻāĻžāĻ āĻāϰāĻžāĨ¤
- āĻŽāĻŋāĻĄāϞāĻāϝāĻŧā§āϝāĻžāϰā§āϰ āϏāĻžāĻĨā§ āĻāĻžāĻ āĻāϰāĻžāĨ¤
- āϏā§āĻā§āϝāĻžāĻāĻŋāĻ āĻĢāĻžāĻāϞā§āϰ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻžāĻāϰāĻŖāĨ¤
- āϏāĻ āĻŋāĻ āĻļāĻžāĻāĻĄāĻžāĻāύāĨ¤
Skillbox āϏā§āĻĒāĻžāϰāĻŋāĻļ āĻāϰā§: āĻŦā§āϝāĻŦāĻšāĻžāϰāĻŋāĻ āĻā§āϰā§āϏ .
āĻāĻŽāϰāĻž āĻŽāύ⧠āĻāϰāĻŋāϝāĻŧā§ āĻĻāĻŋāĻā§āĻāĻŋ: "Habr"-āĻāϰ āϏāĻāϞ āĻĒāĻžāĻ āĻāĻĻā§āϰ āĻāύā§āϝ - "Habr" āĻĒā§āϰāĻāĻžāϰāĻŽā§āϞāĻ āĻā§āĻĄ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āϝā§āĻā§āύ⧠Skillbox āĻā§āϰā§āϏ⧠āύāĻĨāĻŋāĻā§āĻā§āϤ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ 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
āĻāĻĻāĻžāĻšāϰāĻŖ āĻĒā§āϝāĻžāĻā§āĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§ , āĻāĻāĻŋ āϏāĻžāϰā§āĻāĻžāϰ āĻāĻŦāĻ HTTP āĻā§āϞāĻžāϝāĻŧā§āύā§āĻ āĻāĻāϝāĻŧ āĻŦāĻŋāĻāĻžāĻļā§āϰ āĻāύā§āϝ Go-āϤ⧠āĻĒā§āϰāĻžāĻĨāĻŽāĻŋāĻ āϏāϰāĻā§āĻāĻžāĻŽāĨ¤ āĻā§āĻĄāĻāĻŋ āĻŦā§āĻāĻžāϰ āĻāύā§āϝ, āĻāϏā§āύ āϤāĻŋāύāĻāĻŋ āĻā§āϰā§āϤā§āĻŦāĻĒā§āϰā§āĻŖ āĻāĻĒāĻžāĻĻāĻžāύā§āϰ āĻ āϰā§āĻĨ āĻŦā§āĻāϤ⧠āĻĒāĻžāϰāĻŋ: 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.
āĻāĻāĻŋ āĻāύāĻĢāĻŋāĻāĻžāϰ āĻāϰāĻžāϰ āϏāĻŦāĻā§āϝāĻŧā§ āϏāĻšāĻ āĻāĻĒāĻžāϝāĻŧ āĻšāϞ autocert.NewListener āĻĒāĻĻā§āϧāϤāĻŋāĻāĻŋ http.Serve-āĻāϰ āϏāĻžāĻĨā§ āĻāĻāϤā§āϰ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻžāĨ¤ HTTP āϏāĻžāϰā§āĻāĻžāϰ āĻ āύā§āϰā§āϧāĻā§āϞāĻŋ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻž āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ āĻĒāĻĻā§āϧāϤāĻŋāĻāĻŋ āĻāĻĒāύāĻžāĻā§ TLS āĻļāĻāϏāĻžāĻĒāϤā§āϰāĻā§āϞāĻŋ āĻĒā§āϰāĻžāĻĒā§āϤ āĻāĻŦāĻ āĻāĻĒāĻĄā§āĻ āĻāϰāĻžāϰ āĻ āύā§āĻŽāϤāĻŋ āĻĻā§āϝāĻŧ:
http.Serve(autocert.NewListener("example.com"), nil)āĻāĻŽāϰāĻž āϝāĻĻāĻŋ āĻŦā§āϰāĻžāĻāĻāĻžāϰ⧠āĻāĻĒā§āύ āĻāϰāĻŋ , āĻāĻŽāϰāĻž āĻāĻāĻāĻŋ 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, āϝāĻž āĻāĻĒāύāĻžāĻā§ āĻŽāĻŋāĻĄāϞāĻāϝāĻŧā§āϝāĻžāϰ āĻāĻžāϰā§āϝāĻāĻžāϰāĻŋāϤāĻž āĻĒā§āϰāϏāĻžāϰāĻŋāϤ āĻāϰāϤ⧠āĻĻā§āϝāĻŧāĨ¤
āϏā§āĻā§āϝāĻžāĻāĻŋāĻ āĻĢāĻžāĻāϞā§āϰ āϏāĻžāĻĨā§ āĻāĻžāĻ āĻāϰāĻž
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 āĻĢāĻžāĻāϞ āύāĻž āĻĨāĻžāĻā§āĨ¤ āĻāĻ āĻā§āώā§āϤā§āϰā§, āĻĄāĻŋāϰā§āĻā§āĻāϰāĻŋāĻā§ āĻāĻĒā§āϏ āĻāϰāĻž āĻĨā§āĻā§ āĻāĻāĻāĻžāϤā§, āĻāĻĒāύāĻžāϰ āĻĒā§āϝāĻžāĻā§āĻāĻāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āĻāĻāĻŋāϤ .
āϏāĻ āĻŋāĻ āĻļāĻžāĻāĻĄāĻžāĻāύ
āĻā§-āϤ⧠HTTP āϏāĻžāϰā§āĻāĻžāϰā§āϰ āĻā§āϰā§āϏāĻĢā§āϞ āĻļāĻžāĻāĻĄāĻžāĻāύ āύāĻžāĻŽā§ āĻāĻāĻāĻŋ āĻŦā§āĻļāĻŋāώā§āĻā§āϝ āϰāϝāĻŧā§āĻā§āĨ¤ āĻāĻāĻŋ 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 āĻāĻāĻāĻŋ āĻļāĻā§āϤāĻŋāĻļāĻžāϞ⧠āĻāĻžāώāĻžāĨ¤ āĻāϰ āĻĄāĻŋāĻĢāϞā§āĻ āĻā§āώāĻŽāϤāĻžāĻā§āϞāĻŋ āĻā§āĻŦ āĻĒā§āϰāĻļāϏā§āϤ, āĻāĻŦāĻ āϏā§āĻā§āϞāĻŋāĻā§ āĻāύā§āĻāĻžāϰāĻĢā§āϏ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāύā§āύāϤ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰ⧠- āĻāĻāĻŋ āĻāĻĒāύāĻžāĻā§ āϏāϤā§āϝāĻŋāĻāĻžāϰā§āϰ āύāĻŋāϰā§āĻāϰāϝā§āĻā§āϝ HTTP āϏāĻžāϰā§āĻāĻžāϰāĻā§āϞāĻŋ āĻŦāĻŋāĻāĻžāĻļ āĻāϰāϤ⧠āĻĻā§āϝāĻŧ⧎
Skillbox āϏā§āĻĒāĻžāϰāĻŋāĻļ āĻāϰā§:
- āĻĻā§āĻ āĻŦāĻāϰā§āϰ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻŋāĻ āĻā§āϰā§āϏ .
- āĻļāĻŋāĻā§āώāĻžāĻāϤ āĻ āύāϞāĻžāĻāύ āĻā§āϰā§āϏ .
- āĻŦā§āϝāĻŦāĻšāĻžāϰāĻŋāĻ āĻŦāĻāϰā§āϰ āĻā§āϰā§āϏ .
āĻāϤā§āϏ: www.habr.com
