āĻĒāĻžāĻāĻ āĻŦāĻāĻ° āĻāĻā§ āĻļā§āĻ°ā§ āĻāĻ°ā§āĻāĻŋāĻ˛āĻžāĻŽ
āĻāĻ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻāĻŋ 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
āĻāĻĻāĻžāĻšāĻ°āĻŖ āĻĒā§āĻ¯āĻžāĻā§āĻ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻž āĻšāĻ¯āĻŧā§āĻā§ 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
.
āĻāĻāĻŋ āĻāĻ¨āĻĢāĻŋāĻāĻžāĻ° āĻāĻ°āĻžāĻ° āĻ¸āĻŦāĻā§āĻ¯āĻŧā§ āĻ¸āĻšāĻ āĻāĻĒāĻžāĻ¯āĻŧ āĻšāĻ˛ autocert.NewListener āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻāĻŋ http.Serve-āĻāĻ° āĻ¸āĻžāĻĨā§ āĻāĻāĻ¤ā§āĻ°ā§ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻžāĨ¤ 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, āĻ¯āĻž āĻāĻĒāĻ¨āĻžāĻā§ āĻŽāĻŋāĻĄāĻ˛āĻāĻ¯āĻŧā§āĻ¯āĻžāĻ° āĻāĻžāĻ°ā§āĻ¯āĻāĻžāĻ°āĻŋāĻ¤āĻž āĻĒā§āĻ°āĻ¸āĻžāĻ°āĻŋāĻ¤ āĻāĻ°āĻ¤ā§ āĻĻā§āĻ¯āĻŧāĨ¤
āĻ¸ā§āĻā§āĻ¯āĻžāĻāĻŋāĻ āĻĢāĻžāĻāĻ˛ā§āĻ° āĻ¸āĻžāĻĨā§ āĻāĻžāĻ āĻāĻ°āĻž
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 āĻĢāĻžāĻāĻ˛ āĻ¨āĻž āĻĨāĻžāĻā§āĨ¤ āĻāĻ āĻā§āĻˇā§āĻ¤ā§āĻ°ā§, āĻĄāĻŋāĻ°ā§āĻā§āĻāĻ°āĻŋāĻā§ āĻāĻĒā§āĻ¸ āĻāĻ°āĻž āĻĨā§āĻā§ āĻāĻāĻāĻžāĻ¤ā§, āĻāĻĒāĻ¨āĻžāĻ° āĻĒā§āĻ¯āĻžāĻā§āĻāĻāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻž āĻāĻāĻŋāĻ¤ unindexed
āĻ¸āĻ āĻŋāĻ āĻļāĻžāĻāĻĄāĻžāĻāĻ¨
āĻā§-āĻ¤ā§ 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 āĻ¸ā§āĻĒāĻžāĻ°āĻŋāĻļ āĻāĻ°ā§:
- āĻĻā§āĻ āĻŦāĻāĻ°ā§āĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻŋāĻ āĻā§āĻ°ā§āĻ¸
"āĻāĻŽāĻŋ āĻāĻāĻāĻ¨ āĻĒā§āĻ°ā§ āĻāĻ¯āĻŧā§āĻŦ āĻĄā§āĻā§āĻ˛āĻĒāĻžāĻ°" .- āĻļāĻŋāĻā§āĻˇāĻžāĻāĻ¤ āĻ āĻ¨āĻ˛āĻžāĻāĻ¨ āĻā§āĻ°ā§āĻ¸
"āĻĒā§āĻļāĻž āĻāĻžāĻāĻž āĻŦāĻŋāĻāĻžāĻļāĻāĻžāĻ°ā§" .- āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻŋāĻ āĻŦāĻāĻ°ā§āĻ° āĻā§āĻ°ā§āĻ¸
"0 āĻĨā§āĻā§ PRO āĻĒāĻ°ā§āĻ¯āĻ¨ā§āĻ¤ āĻĒāĻŋāĻāĻāĻāĻĒāĻŋ āĻŦāĻŋāĻāĻžāĻļāĻāĻžāĻ°ā§" .
āĻāĻ¤ā§āĻ¸: www.habr.com