Mmepe sava weebụ na Golang - site na mfe ruo mgbagwoju anya

Mmepe sava weebụ na Golang - site na mfe ruo mgbagwoju anya

Afọ ise gara aga ka m malitere ịzụlite Gophish, nke a nyere ohere ịmụta Golang. Achọpụtara m na Go bụ asụsụ siri ike, nke ọtụtụ ọba akwụkwọ na-akwado. Go dị iche iche: karịsịa, enwere ike iji ya mepụta ngwa n'akụkụ ihe nkesa na-enweghị nsogbu ọ bụla.

Edemede a bụ maka ịde ihe nkesa na Go. Ka anyị jiri ihe ndị dị mfe bido dịka "Ndewo ụwa!" wee mechie ngwa nwere ikike ndị a:

- Iji Ka anyị Encrypt maka HTTPS.
- Na-arụ ọrụ dị ka onye rawụta API.
- Na-arụ ọrụ na middleware.
- Nhazi faịlụ static.
- Mmechi ziri ezi.

Skillbox na-atụ aro: Usoro bara uru "Onye nrụpụta Python si ọkọ".

Anyị na -echetara: maka ndị na-agụ Habr niile - ego 10 ruble mgbe ị na-edebanye aha na nkuzi Skillbox ọ bụla site na iji koodu mgbasa ozi Habr.

Ndewo Ụwa!

Ị nwere ike ịmepụta sava weebụ na Go ngwa ngwa. Nke a bụ ọmụmaatụ nke iji onye njikwa na-eweghachite “Ndewo, ụwa!” ekwere n'elu.

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)
}

Mgbe nke a gasịrị, ọ bụrụ na ị na-agba ọsọ ngwa ma mepee ibe ahụ localhost, mgbe ahụ, ị ​​ga-ahụ ozugbo ederede bụ "Ndewo, ụwa!" (ọ bụrụ na ihe niile na-arụ ọrụ nke ọma, n'ezie).

Anyị ga-eji onye njikwa ahụ ọtụtụ oge ma emechaa, mana ka anyị buru ụzọ ghọta ka ihe niile si arụ ọrụ.

netwọk/http

Ihe atụ jiri ngwugwu ahụ net/http, ọ bụ ngwá ọrụ bụ isi na Go maka ịmepụta ma sava na ndị ahịa HTTP. Iji ghọta koodu ahụ, ka anyị ghọta ihe atọ dị mkpa pụtara: http.Handler, http.ServeMux na http.Server.

Ndị na-ahụ maka HTTP

Mgbe anyị nwetara arịrịọ, onye njikwa na-enyocha ya wee wepụta nzaghachi. A na-emejuputa njikwa na Go dị ka ndị a:

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

Ihe atụ nke mbụ na-eji ọrụ enyemaka http.HandleFunc. Ọ na-ekpuchi ọrụ ọzọ, nke n'aka nke ya na-ewe http.ResponseWriter na http.Request n'ime ServeHTTP.

N'ikwu ya n'ụzọ ọzọ, a na-enye ndị na-elekọta ihe na Golang n'otu interface, nke na-enye ọtụtụ nhọrọ maka onye mmemme. Yabụ, dịka ọmụmaatụ, middleware na-eji onye njikwa arụ ọrụ, ebe ServeHTTP na-ebu ụzọ mee ihe wee kpọọ usoro ServeHTTP nke onye njikwa ọzọ.

Dịka e kwuru n'elu, ndị na-ahụ maka njikwa na-emepụta azịza maka arịrịọ. Ma olee otu onye njikwa kwesịrị iji n'otu oge na oge?

Rịọ okporo ụzọ

Iji mee nhọrọ ziri ezi, jiri HTTP multiplexer. N'ọtụtụ ọba akwụkwọ a na-akpọ ya muxer ma ọ bụ rawụta, mana ha niile bụ otu ihe. Ọrụ nke multiplexer bụ inyocha ụzọ arịrịọ wee họrọ onye njikwa kwesịrị ekwesị.

Ọ bụrụ na ịchọrọ nkwado maka ntụgharị mgbagwoju anya, mgbe ahụ ọ ka mma iji ụlọ akwụkwọ ndị ọzọ. Ụfọdụ n'ime ndị kachasị elu - gorilla/mux и go-chi/chi, Ụlọ akwụkwọ ndị a na-eme ka o kwe omume ịmepụta nhazi etiti n'enweghị nsogbu ọ bụla. Site n'enyemaka ha, ị nwere ike hazie ụzọ ụgbọ ala wildcard wee rụọ ọtụtụ ọrụ ndị ọzọ. Uru ha bụ ndakọrịta na ndị njikwa HTTP ọkọlọtọ. N'ihi ya, ị nwere ike ide koodu dị mfe nke nwere ike gbanwee n'ọdịnihu.

Na-arụ ọrụ na mgbagwoju frameworks na a nkịtị ọnọdụ ga-achọ ndị na-abụghị ọkọlọtọ ngwọta, na nke a budata mgbagwoju anya ojiji nke ndabara handlers. Iji mepụta ọnụ ọgụgụ ka ukwuu nke ngwa, nchikota nke ọba akwụkwọ ndabara na rawụta dị mfe ga-ezuru.

Nhazi ajụjụ

Na mgbakwunye, anyị chọrọ akụrụngwa nke “ga-ege ntị” maka njikọ mbata wee zigharịa arịrịọ niile na onye njikwa ziri ezi. http.Server nwere ike ijikwa ọrụ a n'ụzọ dị mfe.

Ihe ndị a na-egosi na ihe nkesa na-ahụ maka ọrụ niile metụtara nhazi njikọ. Nke a, dịka ọmụmaatụ, na-arụ ọrụ site na iji protocol TLS. Iji mejuputa oku http.ListenAndServer, a na-eji sava HTTP ọkọlọtọ.

Ugbu a, ka anyị leba anya n'ihe atụ ndị dị mgbagwoju anya.

Na-agbakwụnye Ka anyị zoo

Site na ndabara, ngwa anyị na-aga n'elu protocol HTTP, mana akwadoro iji HTTPS protocol. Enwere ike ime nke a na-enweghị nsogbu na Go. Ọ bụrụ na ị nwetala asambodo na igodo nzuzo, yabụ ezuru idebanye aha ListenAndServeTLS site na iji asambodo na faịlụ igodo ziri ezi.

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

Ị nwere ike ime nke ọma mgbe niile.

Ka anyị zoo na-enye asambodo efu na mmeghari ohuru akpaaka. Iji jiri ọrụ ahụ, ịchọrọ ngwugwu autocert.

Ụzọ kachasị mfe iji hazie ya bụ iji usoro autocert.NewListener yana njikọ http.Serve. Usoro a na-enye gị ohere ịnweta ma melite asambodo TLS ka ihe nkesa HTTP na-arịọ:

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

Ọ bụrụ na anyị emepee na ihe nchọgharị example.com, anyị ga-enweta nzaghachi HTTPS "Ndewo, ụwa!"

Ọ bụrụ na ịchọrọ nhazi zuru ezu karị, mgbe ahụ ị ga-eji njikwa autocert.Manager. Mgbe ahụ, anyị na-emepụta ihe atụ http.Server nke anyị (ruo ugbu a anyị na-eji ya na ndabara) wee tinye onye njikwa na sava 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("", "")

Nke a bụ ụzọ dị mfe iji mejuputa nkwado HTTPS zuru oke yana mmeghari akwụkwọ ọhụrụ akpaka.

Na-agbakwụnye ụzọ omenala

The ndabara rawụta gụnyere na ọkọlọtọ ọba akwụkwọ dị mma, ma ọ bụ nnọọ isi. Ọtụtụ ngwa na-achọ ụzọ ụzọ dị mgbagwoju anya karịa, gụnyere ụzọ akwụkwụ na nke kaadị, ma ọ bụ usoro maka ịtọ ụkpụrụ na parampat ụzọ.

N'okwu a, ọ bara uru iji ngwugwu gorilla/mux и go-chi/chi. Anyị ga-amụta otú e si arụ ọrụ na nke ikpeazụ - a na-egosi ihe atụ n'okpuru.

Enyere bụ faịlụ api/v1/api.go nwere ụzọ maka API anyị:

/ 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
}

Anyị edobere prefix api/vq maka ụzọ dị na faịlụ bụ isi.

Anyị nwere ike bulie nke a na isi rawụta anyị n'okpuru api / v1 / prefix azụ na ngwa anyị bụ isi:

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

Mfe nke Go na-arụ ọrụ na ụzọ mgbagwoju anya na-eme ka o kwe omume ime ka nhazi na mmezi nke nnukwu ngwa ngwa dị mgbagwoju anya.

Na-arụ ọrụ na middleware

Nhazi gụnyere ijikọ otu onye na-ahụ maka HTTP na onye ọzọ, na-eme ka o kwe omume ngwa ngwa ịrụ nyocha, mkpakọ, osisi, na ọtụtụ ọrụ ndị ọzọ.

Dịka ọmụmaatụ, ka anyị leba anya na interface http.Handler; anyị ga-eji ya dee onye njikwa na-akwado ndị ọrụ ọrụ.

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)
    })
}

Enwere ndị na-anya ụgbọ ala, dị ka chi, na-enye gị ohere ịgbatị ọrụ etiti.

Na-arụ ọrụ na static faịlụ

Ọbá akwụkwọ ọkọlọtọ Go gụnyere ikike iji ọdịnaya kwụ ọtọ rụọ ọrụ, gụnyere onyonyo, faịlụ Javascript na CSS. Enwere ike ịnweta ha site na ọrụ http.FileServer. Ọ na-eweghachi onye njikwa na-enye faịlụ site na otu ndekọ aha.

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

Ọ bụ maa kwesịrị icheta na http.Dir na-egosiputa ọdịnaya nke ndekọ ma ọ bụrụ na o nweghị isi index.html faịlụ. N'okwu a, iji gbochie imebi ndekọ ahụ, ị ​​kwesịrị iji ngwugwu ahụ unindexed.

Mmechi ziri ezi

Go nwekwara atụmatụ akpọrọ ọmarịcha mmechi nke sava HTTP. Enwere ike ime nke a site na iji usoro nkwụsị (). A na-amalite ihe nkesa ahụ na goroutine, wee gee ọwa ahụ ka ọ nweta mgbaama nkwụsịtụ. Ozugbo enwetara mgbaàmà ahụ, ihe nkesa na-agbanyụ, ma ọ bụghị ozugbo, ma mgbe sekọnd ole na ole gasịrị.

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)

Dị ka njedebe

Go bụ asụsụ siri ike nwere ọbá akwụkwọ ọkọlọtọ fọrọ nke nta ka ọ bụrụ ụwa niile. Ikike ndabara ya sara mbara, yana enwere ike ịkwalite ya site na iji interfaces - nke a na-enye gị ohere ịmepụta sava HTTP a pụrụ ịdabere na ya n'ezie.

Skillbox na-atụ aro:

isi: www.habr.com

Tinye a comment