ื•ื•ืขื‘ ืกืขืจื•ื•ืขืจ ืึทื ื˜ื•ื•ื™ืงืœื•ื ื’ ืื™ืŸ Golang - ืคึฟื•ืŸ ืคึผืฉื•ื˜ ืฆื• ืงืึธืžืคึผืœืขืงืก

ื•ื•ืขื‘ ืกืขืจื•ื•ืขืจ ืึทื ื˜ื•ื•ื™ืงืœื•ื ื’ ืื™ืŸ Golang - ืคึฟื•ืŸ ืคึผืฉื•ื˜ ืฆื• ืงืึธืžืคึผืœืขืงืก

ืžื™ื˜ ืคื™ื ืฃ ื™ืืจ ืฆื•ืจื™ืง ืื™ืš ืื ื’ืขื”ื•ื™ื‘ืŸ ืึทื ื˜ื•ื•ื™ืงืœืขืŸ Gophish, ื“ืึธืก ืื™ื– ื’ืขื•ื•ืขืŸ ืึท ื’ืขืœืขื’ื ื”ื™ื™ื˜ ืฆื• ืœืขืจื ืขืŸ ื’ืึธืœืึทื ื’. ืื™ืš ืื™ื™ื ื’ืขื–ืขืŸ ืึทื– Go ืื™ื– ืึท ืฉื˜ืึทืจืง ืฉืคึผืจืึทืš, ืงืึทืžืคึผืœืึทืžืขื ื˜ื™ื“ ื“ื•ืจืš ืคื™ืœืข ืœื™ื™ื‘ืจืขืจื™ื–. Go ืื™ื– ื•ื•ืขืจืกืึทื˜ืึทืœ: ืื™ืŸ ื‘ืึทื–ื•ื ื“ืขืจ, ืขืก ืงืขื ืขืŸ ื–ื™ื™ืŸ ื’ืขื ื™ืฆื˜ ืฆื• ืึทื ื˜ื•ื•ื™ืงืœืขืŸ ืกืขืจื•ื•ืขืจ ื–ื™ื™ึทื˜ ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื– ืึธืŸ ืงื™ื™ืŸ ืคืจืื‘ืœืขืžืขืŸ.

ื“ืขืจ ืึทืจื˜ื™ืงืœ ืื™ื– ื•ื•ืขื’ืŸ ืฉืจื™ื™ื‘ืŸ ืึท ืกืขืจื•ื•ืขืจ ืื™ืŸ Go. ืœืึธืžื™ืจ ืึธื ื”ื™ื™ื‘ืŸ ืžื™ื˜ ืคึผืฉื•ื˜ ื˜ื™ื ื’ื– ื•ื•ื™ "ื”ืขืœื ื•ื•ืขืœื˜!" ืื•ืŸ ืกื•ืฃ ืžื™ื˜ ืึท ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืžื™ื˜ ื“ื™ ืคืืœื’ืขื ื“ืข ืงื™ื™ืคึผืึทื‘ื™ืœืึทื˜ื™ื–:

- ื ื™ืฆืŸ Let's Encrypt ืคึฟืึทืจ HTTPS.
- ืืจื‘ืขื˜ืŸ ื•ื•ื™ ืึท ืึทืคึผื™ ืจืึทื•ื˜ืขืจ.
- ืืจื‘ืขื˜ืŸ ืžื™ื˜ ืžื™ื˜ืœื•ื•ืึทืจืข.
- ืคึผืจืึทืกืขืกื™ื ื’ ืคื•ืŸ ืกื˜ืึทื˜ื™ืง ื˜ืขืงืขืก.
โ€” ืจื™ื›ื˜ื™ืงืข ืคืืจืฉืœืืกืŸ.

Skillbox ืจืขืงืึทืžืขื ื“ื–: ืคึผืจืึทืงื˜ื™ืฉ ืงื•ืจืก "Python ื“ืขื•ื•ืขืœืึธืคึผืขืจ ืคึฟื•ืŸ ืงืจืึทืฆืŸ".

ืžื™ืจ ื“ืขืจืžืึธื ืขืŸ ืื™ืจ: ืคึฟืึทืจ ืึทืœืข ืœื™ื™ืขื ืขืจ ืคื•ืŸ "ื”ื‘ืจ" - ืึท ืึทืจืึธืคึผืจืขื›ืขื ืขืŸ ืคื•ืŸ 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)
}

ื ืึธืš ื“ืขื, ืื•ื™ื‘ ืื™ืจ ืœื•ื™ืคืŸ ื“ื™ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืื•ืŸ ืขืคืขื ืขืŸ ื“ืขื ื‘ืœืึทื˜ ืœืึธืงืึทืœื”ืึธืกื˜, ื“ืขืžืึธืœื˜ ืื™ืจ ื•ื•ืขื˜ ืžื™ื“ ื–ืขืŸ ื“ื™ ื˜ืขืงืกื˜ "ื”ืขืœื, ื•ื•ืขืœื˜!" (ืื•ื™ื‘ ืึทืœืฅ ืึทืจื‘ืขื˜ ืจื™ื›ื˜ื™ืง, ืคื•ืŸ ืงื•ืจืก).

ืžื™ืจ ื•ื•ืขืœืŸ ื ื•ืฆืŸ ื“ื™ ื”ืึทื ื“ืœืขืจ ืขื˜ืœืขื›ืข ืžืึธืœ ืฉืคึผืขื˜ืขืจ, ืึธื‘ืขืจ ืขืจืฉื˜ืขืจ ืœืึธื–ืŸ ืื•ื ื“ื– ืคึฟืึทืจืฉื˜ื™ื™ืŸ ื•ื•ื™ ืึทืœืฅ ืึทืจื‘ืขื˜.

ื ืขืฅ/ื”ื˜ื˜ืคึผ

ื“ืขืจ ื‘ื™ื™ึทืฉืคึผื™ืœ ื’ืขื ื™ืฆื˜ ื“ื™ ืคึผืขืงืœ net/http, ืขืก ืื™ื– ื“ื™ ืขืจืฉื˜ื™ืง ื’ืขืฆื™ื™ึทื’ ืื™ืŸ Go ืคึฟืึทืจ ื“ืขื•ื•ืขืœืึธืคึผื™ื ื’ ื‘ื™ื™ื“ืข ืกืขืจื•ื•ืขืจืก ืื•ืŸ ื”ื˜ื˜ืคึผ ืงืœื™ื™ืึทื ืฅ. ืฆื• ืคึฟืึทืจืฉื˜ื™ื™ืŸ ื“ืขื ืงืึธื“, ืœืึธื–ืŸ ืื•ื ื“ื– ืคึฟืึทืจืฉื˜ื™ื™ืŸ ื“ื™ ื˜ื™ื™ึทื˜ืฉ ืคื•ืŸ ื“ืจื™ื™ ื•ื•ื™ื›ื˜ื™ืง ืขืœืขืžืขื ื˜ืŸ: http.Handler, http.ServeMux ืื•ืŸ http.Server.

ื”ื˜ื˜ืคึผ ื”ืึทื ื“ืœืขืจืก

ื•ื•ืขืŸ ืžื™ืจ ื‘ืึทืงื•ืžืขืŸ ืึท ื‘ืงืฉื”, ื“ืขืจ ื”ืึทื ื“ืœืขืจ ืึทื ืึทืœื™ื–ืขืก ืขืก ืื•ืŸ ื“ื–ืฉืขื ืขืจื™ื™ืฅ ืึท ืขื ื˜ืคืขืจ. ื”ืึทื ื“ืœืขืจืก ืื™ืŸ Go ื–ืขื ืขืŸ ื™ืžืคึผืœืึทืžืขื ืึทื“ ื•ื•ื™ ื’ื™ื™ื˜:

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

ื“ืขืจ ืขืจืฉื˜ืขืจ ื‘ื™ื™ึทืฉืคึผื™ืœ ื ื™ืฆื˜ ื“ื™ http.HandleFunc ื”ืขืœืคืขืจ ืคึฟื•ื ืงืฆื™ืข. ืขืก ืจืึทืคึผืก ืืŸ ืื ื“ืขืจ ืคึฟื•ื ืงืฆื™ืข, ื•ื•ืึธืก ืื™ืŸ ืงืขืจ ื ืขืžื˜ http.ResponseWriter ืื•ืŸ http.Request ืื™ืŸ ServeHTTP.

ืื™ืŸ ืื ื“ืขืจืข ื•ื•ืขืจื˜ืขืจ, ื”ืึทื ื“ืœืขืจืก ืื™ืŸ Golang ื–ืขื ืขืŸ ื“ืขืจืœืื ื’ื˜ ืื™ืŸ ืึท ืื™ื™ืŸ ืฆื•ื‘ื™ื ื“, ื•ื•ืึธืก ื’ื™ื˜ ืึท ืคึผืœืึทืฅ ืคื•ืŸ ืึธืคึผืฆื™ืขืก ืฆื• ื“ื™ ืคึผืจืึธื’ืจืึทืžื™ืกื˜. ืึทื–ื•ื™, ืคึฟืึทืจ ื‘ื™ื™ึทืฉืคึผื™ืœ, ืžื™ื“ืึทืœื•ื•ืึทืจืข ืื™ื– ื™ืžืคึผืœืึทืžืขื ืึทื“ ื ื™ืฆืŸ ืึท ื”ืึทื ื“ืœืขืจ, ื•ื•ื• ServeHTTP ืขืจืฉื˜ืขืจ ื˜ื•ื˜ ืขืคึผืขืก ืื•ืŸ ื“ืึทืŸ ืจื•ืคื˜ ื“ื™ ServeHTTP ืื•ืคึฟืŸ ืคื•ืŸ ืืŸ ืื ื“ืขืจ ื”ืึทื ื“ืœืขืจ.

ื•ื•ื™ ื“ืขืจืžืื ื˜ ืื•ื™ื‘ืŸ, ื”ืึทื ื“ืœืขืจืก ืคืฉื•ื˜ ื“ื–ืฉืขื ืขืจื™ื™ื˜ ืจืขืกืคึผืึธื ืกืขืก ืฆื• ืจื™ืงื•ื•ืขืก. ืึธื‘ืขืจ ื•ื•ืึธืก ื‘ืึทื–ื•ื ื“ืขืจ ื”ืึทื ื“ืœืขืจ ื–ืึธืœ ื–ื™ื™ืŸ ื’ืขื•ื•ื™ื™ื ื˜ ืื™ืŸ ืึท ื‘ืึทื–ื•ื ื“ืขืจ ืคื•ื ื˜ ืื™ืŸ ืฆื™ื™ื˜?

ื‘ืขื˜ืŸ ืจื•ื˜ื™ื ื’

ืฆื• ืžืึทื›ืŸ ื“ื™ ืจืขื›ื˜ ื‘ืจื™ืจื”, ื ื•ืฆืŸ ืึท ื”ื˜ื˜ืคึผ ืžื•ืœื˜ื™ืคึผืœืขืงืกืขืจ. ืื™ืŸ ืึท ื ื•ืžืขืจ ืคื•ืŸ ืœื™ื™ื‘ืจืขืจื™ื– ืขืก ืื™ื– ื’ืขืจื•ืคืŸ ืžื•ืงืกืขืจ ืึธื“ืขืจ ืจืึทื•ื˜ืขืจ, ืึธื‘ืขืจ ื–ื™ื™ ื–ืขื ืขืŸ ืึทืœืข ื“ื™ ื–ืขืœื‘ืข ื–ืึทืš. ื“ื™ ืคื•ื ืงืฆื™ืข ืคื•ืŸ โ€‹โ€‹โ€‹โ€‹ื“ื™ ืžื•ืœื˜ื™ืคึผืœืขืงืกืขืจ ืื™ื– ืฆื• ืคื•ื ืึทื ื“ืขืจืงืœื™ื™ึทื‘ืŸ ื“ื™ ื‘ืขื˜ืŸ ื“ืจืš ืื•ืŸ ืกืขืœืขืงื˜ื™ืจืŸ ื“ืขื ืฆื•ื ืขืžืขืŸ ื”ืึทื ื“ืœืขืจ.

ืื•ื™ื‘ ืื™ืจ ื“ืึทืจืคึฟืŸ ืฉื˜ื™ืฆืŸ ืคึฟืึทืจ ืงืึธืžืคึผืœืขืงืก ืจื•ื˜ื™ื ื’, ืขืก ืื™ื– ื‘ืขืกืขืจ ืฆื• ื ื•ืฆืŸ ื“ืจื™ื˜-ืคึผืึทืจื˜ื™ื™ ืœื™ื™ื‘ืจืขืจื™ื–. ืขื˜ืœืขื›ืข ืคื•ืŸ โ€‹โ€‹ื“ื™ ืžืขืจืกื˜ ืึทื•ื•ืึทื ืกื™ืจื˜ืข - ื’ืึธืจื™ืœืœืึท / ืžื•ืงืก ะธ ื’ื™ื™ืŸ-ื˜ืฉื™ / ื˜ืฉื™, ื“ื™ ืœื™ื™ื‘ืจืขืจื™ื– ืžืึทื›ืŸ ืขืก ืžืขื’ืœืขืš ืฆื• ื™ื ืกื˜ืจื•ืžืขื ื˜ ื™ื ื˜ืขืจืžื™ื“ื™ื™ื˜ ืคึผืจืึทืกืขืกื™ื ื’ ืึธืŸ ืงื™ื™ืŸ ืคืจืื‘ืœืขืžืขืŸ. ืžื™ื˜ ื–ื™ื™ืขืจ ื”ื™ืœืฃ, ืื™ืจ ืงืขื ืขืŸ ืงืึทื ืคื™ื’ื™ืขืจ ื•ื•ื™ืœื“ืงืึทืจื“ ืจื•ื˜ื™ื ื’ ืื•ืŸ ื“ื•ืจื›ืคื™ืจืŸ ืึท ื ื•ืžืขืจ ืคื•ืŸ ืื ื“ืขืจืข ื˜ืึทืกืงืก. ื–ื™ื™ืขืจ ืžื™ื™ึทืœืข ืื™ื– ืงืึทืžืคึผืึทื˜ืึทื‘ื™ืœืึทื˜ื™ ืžื™ื˜ ื ืึธืจืžืึทืœ ื”ื˜ื˜ืคึผ ื”ืึทื ื“ืœืขืจืก. ื•ื•ื™ ืึท ืจืขื–ื•ืœื˜ืึทื˜, ืื™ืจ ืงืขื ืขืŸ ืฉืจื™ื™ึทื‘ืŸ ืคึผืฉื•ื˜ ืงืึธื“ ื•ื•ืึธืก ืงืขื ืขืŸ ื–ื™ื™ืŸ ืžืึทื“ืึทืคื™ื™ื“ ืื™ืŸ ื“ืขืจ ืฆื•ืงื•ื ืคึฟื˜.

ืืจื‘ืขื˜ืŸ ืžื™ื˜ ืงืึธืžืคึผืœืขืงืก ืคืจืึทืžืขื•ื•ืึธืจืงืก ืื™ืŸ ืึท ื ืึธืจืžืึทืœ ืกื™ื˜ื•ืึทืฆื™ืข ื•ื•ืขื˜ ื“ืึทืจืคืŸ ื ื™ื˜-ื ืึธืจืžืึทืœ ืกืึทืœื•ืฉืึทื ื–, ืื•ืŸ ื“ืึธืก ื‘ืื˜ื™ื™ื˜ื™ืง ืงืึทืžืคึผืœื™ืงื™ื™ืฅ ื“ื™ ื ื•ืฆืŸ ืคื•ืŸ ืคืขืœื™ืงื™ื™ึทื˜ ื”ืึทื ื“ืœืขืจืก. ืฆื• ืฉืึทืคึฟืŸ ื“ื™ ื•ื•ืึทืกื˜ ืžืขืจื”ื™ื™ึทื˜ ืคื•ืŸ ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื–, ืึท ืงืึธืžื‘ื™ื ืึทืฆื™ืข ืคื•ืŸ โ€‹โ€‹โ€‹โ€‹ื“ื™ ืคืขืœื™ืงื™ื™ึทื˜ ื‘ื™ื‘ืœื™ืึธื˜ืขืง ืื•ืŸ ืึท ืคึผืฉื•ื˜ ืจืึทื•ื˜ืขืจ ื•ื•ืขื˜ ื–ื™ื™ืŸ ื’ืขื ื•ื’.

ืึธื ืคึฟืจืขื’ ืคึผืจืึทืกืขืกื™ื ื’

ืื™ืŸ ืึทื“ื™ืฉืึทืŸ, ืžื™ืจ ื“ืึทืจืคึฟืŸ ืึท ืงืึธืžืคึผืึธื ืขื ื˜ ื•ื•ืึธืก ื•ื•ืขื˜ "ื”ืขืจืŸ" ืคึฟืึทืจ ื™ื ืงืึทืžื™ื ื’ ืงืึทื ืขืงืฉืึทื ื– ืื•ืŸ ืจื™ื“ืขืจืขืงื˜ ืึทืœืข ืจื™ืงื•ื•ืขืก ืฆื• ื“ื™ ืจื™ื›ื˜ื™ืง ื”ืึทื ื“ืœืขืจ. ื”ื˜ื˜ืคึผ.ืกืขืจื•ื•ืขืจ ืงืขื ืขืŸ ืœื™ื™ื›ื˜ ืฉืขืคึผืŸ ื“ืขื ืึทืจื‘ืขื˜.

ื“ื™ ืคืืœื’ืขื ื“ืข ื•ื•ื™ื™ื–ื˜ ืึทื– ื“ืขืจ ืกืขืจื•ื•ืขืจ ืื™ื– ืคืึทืจืึทื ื˜ื•ื•ืึธืจื˜ืœืขืš ืคึฟืึทืจ ืึทืœืข ื˜ืึทืกืงืก ื•ื•ืึธืก ื–ืขื ืขืŸ ืฉื™ื™ืš ืฆื• ืงืฉืจ ืคึผืจืึทืกืขืกื™ื ื’. ื“ืึธืก, ืœืžืฉืœ, ืึทืจื‘ืขื˜ ืžื™ื˜ ื“ื™ TLS ืคึผืจืึธื˜ืึธืงืึธืœ. ืฆื• ื™ื ืกื˜ืจื•ืžืขื ื˜ ื“ื™ http.ListenAndServer ืจื•ืคืŸ, ืึท ื ืึธืจืžืึทืœ ื”ื˜ื˜ืคึผ ืกืขืจื•ื•ืขืจ ืื™ื– ื’ืขื ื™ืฆื˜.

ืื™ืฆื˜ ืœืึธืžื™ืจ ืงื•ืงืŸ ืื™ืŸ ืžืขืจ ืงืึธืžืคึผืœื™ืฆื™ืจื˜ ื‘ื™ื™ืฉืคื™ืœืŸ.

ืึทื“ื™ื ื’ ื–ืืœ ืก ืขื ืงืจื™ืคึผื˜

ื“ื•ืจืš ืคืขืœื™ืงื™ื™ึทื˜, ืื•ื ื“ื–ืขืจ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืœื•ื™ืคื˜ ืื™ื‘ืขืจ ื“ื™ HTTP ืคึผืจืึธื˜ืึธืงืึธืœ, ืึธื‘ืขืจ ืขืก ืื™ื– ืจืขืงืึทืžืขื ื“ื™ื“ ืฆื• ื ื•ืฆืŸ ื“ื™ HTTPS ืคึผืจืึธื˜ืึธืงืึธืœ. ื“ืึธืก ืงืขืŸ ื–ื™ื™ืŸ ื’ืขื˜ืืŸ ืึธืŸ ืคืจืื‘ืœืขืžืขืŸ ืื™ืŸ Go. ืื•ื™ื‘ ืื™ืจ ื”ืึธื˜ ื‘ืืงื•ืžืขืŸ ืึท ื‘ืึทื•ื•ื™ื™ึทื–ืŸ ืื•ืŸ ืคึผืจื™ื•ื•ืึทื˜ ืฉืœื™ืกืœ, ืขืก ืื™ื– ื’ืขื ื•ื’ ืฆื• ืคืึทืจืฉืจื™ื™ึทื‘ืŸ ListenAndServeTLS ืžื™ื˜ ื“ื™ ืจื™ื›ื˜ื™ืง ื‘ืึทื•ื•ื™ื™ึทื–ืŸ ืื•ืŸ ืฉืœื™ืกืœ ื˜ืขืงืขืก.

http.ListenAndServeTLS(":443", "cert.pem", "key.pem", nil)

ืื™ืจ ืงืขื ืขืŸ ืฉื˜ืขื ื“ื™ืง ื˜ืึธืŸ ื‘ืขืกืขืจ.

ื–ืืœ ืก ืขื ืงืจื™ืคึผื˜ ื’ื™ื˜ ืคืจื™ื™ ืกืขืจื˜ื™ืคื™ืงืึทืฅ ืžื™ื˜ ืึธื˜ืึทืžืึทื˜ื™ืง ืจื™ื ื•ืึทืœ. ืื™ืŸ ืกื“ืจ ืฆื• ื ื•ืฆืŸ ื“ื™ ื“ื™ื ืกื˜, ืื™ืจ ื“ืึทืจืคึฟืŸ ืึท ืคึผืขืงืœ autocert.

ื“ื™ ื™ื–ื™ืึทืกื˜ ื•ื•ืขื’ ืฆื• ืงืึทื ืคื™ื’ื™ืขืจ ืขืก ืื™ื– ืฆื• ื ื•ืฆืŸ ื“ื™ autocert.NewListener ืื•ืคึฟืŸ ืื™ืŸ ืงืึธืžื‘ื™ื ืึทืฆื™ืข ืžื™ื˜ http.Serve. ื“ืขืจ ืื•ืคึฟืŸ ืึทืœืึทื•ื– ืื™ืจ ืฆื• ื‘ืึทืงื•ืžืขืŸ ืื•ืŸ ื“ืขืจื”ื™ื™ึทื ื˜ื™ืงืŸ TLS ืกืขืจื˜ื™ืคื™ืงืึทืฅ ื‘ืฉืขืช ื“ื™ HTTP ืกืขืจื•ื•ืขืจ ืคึผืจืึทืกืขืกืึทื– ืจื™ืงื•ื•ืขืก:

http.Serve(autocert.NewListener("example.com"), nil)

ืื•ื™ื‘ ืžื™ืจ ืขืคืขื ืขืŸ ืื™ืŸ ื“ืขื ื‘ืœืขื˜ืขืจืขืจ example.com, ืžื™ืจ ื•ื•ืขืœืŸ ื‘ืึทืงื•ืžืขืŸ ืึทืŸ ื”ื˜ื˜ืคึผืก ืขื ื˜ืคืขืจ "ื”ืขืœื, ื•ื•ืขืœื˜!"

ืื•ื™ื‘ ืื™ืจ ื“ืึทืจืคึฟืŸ ืžืขืจ ื“ื™ื˜ื™ื™ืœื“ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ, ืื™ืจ ื–ืึธืœ ื ื•ืฆืŸ ื“ื™ 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/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
}

ืžื™ืจ ืฉื˜ืขืœืŸ ื“ื™ ืึทืคึผื™ / ื•ื•ืง ืคึผืจืขืคื™ืงืก ืคึฟืึทืจ ืจื•ืฅ ืื™ืŸ ื“ื™ ื”ื•ื™ืคึผื˜ ื˜ืขืงืข.

ืžื™ืจ ืงืขื ืขืŸ ื“ืขืจื™ื‘ืขืจ ืึธื ืงืœืึทืคึผืŸ ื“ืขื ืฆื• ืื•ื ื“ื–ืขืจ ื”ื•ื™ืคึผื˜ ืจืึทื•ื˜ืขืจ ืื•ื ื˜ืขืจ ื“ื™ ืึทืคึผื™ / ื•ื•1 / ืคึผืจืขืคื™ืงืก ืฆื•ืจื™ืง ืื™ืŸ ืื•ื ื“ื–ืขืจ ื”ื•ื™ืคึผื˜ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ:

// 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())

ื’ืึธ ืก ื™ื– ืคื•ืŸ ืืจื‘ืขื˜ืŸ ืžื™ื˜ ืงืึธืžืคึผืœืขืงืก ืจื•ืฅ ืžืื›ื˜ ืขืก ืžืขื’ืœืขืš ืฆื• ืคืึทืจืคึผืึธืฉืขื˜ืขืจืŸ ื“ื™ ืกื˜ืจืึทืงื˜ืฉืขืจื™ื ื’ ืื•ืŸ ื•ื™ืฉืึทืœื˜ ืคื•ืŸ ื’ืจื•ื™ืก, ืงืึธืžืคึผืœืขืงืก ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื–.

ืึทืจื‘ืขื˜ ืžื™ื˜ ืžื™ื˜ืœื•ื•ืึทืจืข

ืกื˜ืึทื’ื™ื ื’ ื™ื ื•ื•ืึทืœื•ื•ื– ืจืึทืคึผื™ื ื’ ืื™ื™ืŸ ื”ื˜ื˜ืคึผ ื”ืึทื ื“ืœืขืจ ืžื™ื˜ ืื ื“ืขืจืŸ, ืžืื›ืŸ ืขืก ืžืขื’ืœืขืš ืฆื• ื’ืขืฉื•ื•ื™ื ื“ ื“ื•ืจื›ืคื™ืจืŸ ืึธื˜ืขื ื˜ืึทืงื™ื™ืฉืึทืŸ, ืงืึทืžืคึผืจืขืฉืึทืŸ, ืœืึธื’ื™ื ื’ ืื•ืŸ ืขื˜ืœืขื›ืข ืื ื“ืขืจืข ืคืึทื ื’ืงืฉืึทื ื–.

ื•ื•ื™ ืึท ื‘ื™ื™ืฉืคึผื™ืœ, ืœืึธืžื™ืจ ืงื•ืงืŸ ืื™ืŸ ื“ื™ ื”ื˜ื˜ืคึผ.ื”ืึทื ื“ืœืขืจ ืฆื•ื‘ื™ื ื“; ืžื™ืจ ื•ื•ืขืœืŸ ื ื•ืฆืŸ ืขืก ืฆื• ืฉืจื™ื™ึทื‘ืŸ ืึท ื”ืึทื ื“ืœืขืจ ื•ื•ืึธืก ืึธื˜ืขื ื˜ืึทืงื™ื™ืฅ ืกืขืจื•ื•ื™ืก ื ื™ืฆืขืจืก.

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

ืขืก ืื™ื– ื‘ืืฉื˜ื™ืžื˜ ื•ื•ืขืจื˜ ื’ืขื“ืขื ืงืขืŸ ืึทื– http.Dir ื“ื™ืกืคึผืœื™ื™ื– ื“ื™ ืื™ื ื”ืึทืœื˜ ืคื•ืŸ ื“ื™ ื•ื•ืขื’ื•ื•ื™ื™ึทื–ืขืจ ืื•ื™ื‘ ืขืก ื˜ื•ื˜ ื ื™ืฉื˜ ืึทื ื˜ื”ืึทืœื˜ืŸ ื“ื™ ื”ื•ื™ืคึผื˜ index.html ื˜ืขืงืข. ืื™ืŸ ื“ืขื ืคืึทืœ, ืฆื• ืคืึทืจืžื™ื™ึทื“ืŸ ื“ื™ ื•ื•ืขื’ื•ื•ื™ื™ึทื–ืขืจ ืคื•ืŸ ืงืึทืžืคึผืจืึทืžื™ื™ื–ื“, ืื™ืจ ื–ืึธืœ ื ื•ืฆืŸ ื“ืขื ืคึผืขืงืœ unindexed.

ืจื™ื›ื˜ื™ืง ืฉืึทื˜ื“ืึทื•ืŸ

Go ืื•ื™ืš ื”ืื˜ ืึท ืฉื˜ืจื™ืš ื’ืขืจื•ืคืŸ ื’ืจืึทืฆื™ืขื– ืฉืึทื˜ื“ืึทื•ืŸ ืคื•ืŸ ื“ื™ ื”ื˜ื˜ืคึผ ืกืขืจื•ื•ืขืจ. ื“ืขื ืงืขื ืขืŸ ื–ื™ื™ืŸ ื’ืขื˜ืืŸ ืžื™ื˜ ื“ื™ 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 ืื™ื– ืึท ืฉื˜ืึทืจืง ืฉืคึผืจืึทืš ืžื™ื˜ ืึท ื›ึผืžืขื˜ ื•ื ื™ื•ื•ืขืจืกืึทืœ ื ืึธืจืžืึทืœ ื‘ื™ื‘ืœื™ืึธื˜ืขืง. ื“ื™ ืคืขืœื™ืงื™ื™ึทื˜ ืงื™ื™ืคึผืึทื‘ื™ืœืึทื˜ื™ื– ื–ืขื ืขืŸ ื–ื™ื™ืขืจ ื‘ืจื™ื™ื˜, ืื•ืŸ ื–ื™ื™ ืงืขื ืขืŸ ื–ื™ื™ืŸ ื™ืžืคึผืจื•ื•ื•ื“ ืžื™ื˜ ื™ื ื˜ืขืจืคื™ื™ืกื™ื– - ื“ืึธืก ืึทืœืึทื•ื– ืื™ืจ ืฆื• ืึทื ื˜ื•ื•ื™ืงืœืขืŸ ื‘ืืžืช ืคืึทืจืœืึธื–ืœืขืš ื”ื˜ื˜ืคึผ ืกืขืจื•ื•ืขืจืก.

Skillbox ืจืขืงืึทืžืขื ื“ื–:

ืžืงื•ืจ: www.habr.com

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’