
рдкрд╛рдВрдЪ рд╕рд╛рд▓ рдкрд╣рд▓реЗ, рдореИрдВрдиреЗ
рдЧреЛрдлрд┐рд╢ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ
рдХрд░ рджрд┐рдпрд╛ , рдЬрд┐рд╕рд╕реЗ рдЧреЛрд▓рдВрдЧ рд╕реАрдЦрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЧрдпрд╛ред рдореИрдВрдиреЗ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдХрд┐ рдЧреЛ рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рднрд╛рд╖рд╛ рд╣реИ, рдЬрд┐рд╕рдХреА рдХреНрд╖рдорддрд╛рдПрдБ рдХрдИ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдкреВрд░рдХ рд╣реИрдВред рдЧреЛ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╣реИ: рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЗрд╕рдХреА рд╕рд╣рд╛рдпрддрд╛ рд╕реЗ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд┐рдирд╛ рд╕рд░реНрд╡рд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред
рдпрд╣ рд▓реЗрдЦ рдЧреЛ рдореЗрдВ рдПрдХ рд╕рд░реНрд╡рд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред рдЖрдЗрдП рд╕рд░рд▓ рдЪреАрдЬреЛрдВ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ, рдЬреИрд╕реЗ "рдирдорд╕реНрддреЗ рджреБрдирд┐рдпрд╛!", рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЖрд╡реЗрджрди рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ:
- HTTPS рдХреЗ рд▓рд┐рдП рд▓реЗрдЯреНрд╕ рдПрдирдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред
- рдПрдкреАрдЖрдИ рд░рд╛рдЙрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдВред
- рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВред
- рд╕реНрдереИрддрд┐рдХ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдгред
- рд╢рдЯрдбрд╛рдЙрди рд╕рд╣реАред
рд╕реНрдХрд┐рд▓рдмреЙрдХреНрд╕ рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░рддрд╛ рд╣реИ: рд╕реНрдХреНрд░реИрдЪ рд╣реИрдВрдб-рдСрди рдХреЛрд░реНрд╕ рд╕реЗ рдкрд╛рдпрдерди рдбреЗрд╡рд▓рдкрд░ ред
рд╣рдо рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рддреЗ рд╣реИрдВ: "рд╣реИрдмрд░" рдХреЗ рд╕рднреА рдкрд╛рдардХреЛрдВ рдХреЗ рд▓рд┐рдП - "рд╣реИрдмрд░" рдкреНрд░реЛрдореЛ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА рднреА рд╕реНрдХрд┐рд▓рдмреЙрдХреНрд╕ рдХреЛрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдкрдВрдЬреАрдХрд░рдг рдХрд░рддреЗ рд╕рдордп 10,000 рд░реВрдмрд▓ рдХреА рдЫреВрдЯред
рдирдорд╕реНрддреЗ рджреБрдирд┐рдпрд╛!
рдЧреЛ рдкрд░ рдПрдХ рд╡реЗрдм рд╕рд░реНрд╡рд░ рдмрдирд╛рдирд╛ рдмрд╣реБрдд рддреЗрдЬ рд╣реИред рдпрд╣рд╛рдВ рдПрдХ рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬреЛ "рд╣реИрд▓реЛ, рджреБрдирд┐рдпрд╛!" рдКрдкрд░ рд╡рд╛рджрд╛ рдХрд░рддрд╛ рд╣реИред
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 рдореЗрдВ рдореБрдЦреНрдп рдЙрдкрдХрд░рдг рд╣реИред рдХреЛрдб рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рддреАрди рдорд╣рддреНрд╡рдкреВрд░реНрдг рддрддреНрд╡реЛрдВ рдХрд╛ рдЕрд░реНрде рджреЗрдЦреЗрдВ: http.Handler, http.ServeMux рдФрд░ http.Serverред
HTTP рд╣реИрдВрдбрд▓рд░реНрд╕
рдЬрдм рд╣рдо рдПрдХ рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣реИрдВрдбрд▓рд░ рдЗрд╕рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдмрдирд╛рддрд╛ рд╣реИред рдЧреЛ рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
type Handler interface { ServeHTTP(ResponseWriter, *Request) }
рдкрд╣рд▓рд╛ рдЙрджрд╛рд╣рд░рдг http.HandleFunc рд╕рд╣рд╛рдпрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рд▓рдкреЗрдЯрддрд╛ рд╣реИ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ http.esponseWriter рдФрд░ http.Request рдХреЛ ServeHTTP рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред
рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдЧреЛрд▓рдВрдЧ рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдХреЛ рдПрдХрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП рдХрдИ рдЕрд╡рд╕рд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорд┐рдбрд▓рд╡реЗрдпрд░ рдПрдХ рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдкрд╣рд▓реЗ ServeHTTP рдХреБрдЫ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рджреВрд╕рд░реЗ рд╣реИрдВрдбрд▓рд░ рдХрд╛ ServeHTTP рд╡рд┐рдзрд┐ рдХрд╣рддрд╛ рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╣реИрдВрдбрд▓рд░ рдХреЗрд╡рд▓ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╕рдордп рдореЗрдВ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдмрд┐рдВрджреБ рдкрд░ рдХрд┐рд╕ рд╡рд┐рд╢реЗрд╖ рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП?
рд░реВрдЯрд┐рдВрдЧ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВ
рд╕рд╣реА рд╡рд┐рдХрд▓реНрдк рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, HTTP рдорд▓реНрдЯреАрдкреНрд▓реЗрдХреНрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЗрд╕реЗ рдХрдИ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рдордХреНрд╕рд░ рдпрд╛ рд░рд╛рдЙрдЯрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рднреА рд╕рдорд╛рди рд╣реИред рдорд▓реНрдЯреАрдкреНрд▓реЗрдХреНрд╕ рдлрд╝рдВрдХреНрд╢рди рдЕрдиреБрд░реЛрдз рдкрде рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдФрд░ рдЙрдкрдпреБрдХреНрдд рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред
рдпрджрд┐ рдЖрдкрдХреЛ рдЬрдЯрд┐рд▓ рдорд╛рд░реНрдЧ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред рд╕рдмрд╕реЗ рдЙрдиреНрдирдд рдореЗрдВ рд╕реЗ рдПрдХ
рдЧреЛрд░рд┐рд▓реНрд▓рд╛ / рдордХреНрд╕ рдФрд░
рдЧреЛ-рдЪреА / рдЪреА рд╣реИ , рдпреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рдордзреНрдпрд╡рд░реНрддреА рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддреЗ рд╣реИрдВред рдЙрдирдХреА рдорджрдж рд╕реЗ, рдЖрдк рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рд░реВрдЯрд┐рдВрдЧ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХрдИ рдЕрдиреНрдп рдХрд╛рд░реНрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрдирдХрд╛ рдкреНрд▓рд╕ рдорд╛рдирдХ HTTP рд╣реИрдВрдбрд▓рд░ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрддрддрд╛ рд╣реИред рдирддреАрдЬрддрди, рдЖрдк рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЗрд╕рдХреЗ рд╕рдВрд╢реЛрдзрди рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рд╕рд╛рде рд╕рд░рд▓ рдХреЛрдб рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред
рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЬрдЯрд┐рд▓ рдврд╛рдВрдЪреЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдорд╛рдирдХ рд╕рдорд╛рдзрд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА, рдФрд░ рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рдХрд░рддрд╛ рд╣реИред рдЕрдзрд┐рдХрд╛рдВрд╢ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдФрд░ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд░рд╛рдЙрдЯрд░ рдХрд╛ рд╕рдВрдпреЛрдЬрди рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред
рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВ
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдореЗрдВ рдПрдХ рдРрд╕реЗ рдШрдЯрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдХреЗ рд▓рд┐рдП "рд╕реБрдиреЗ" рдФрд░ рд╕рд╣реА рд╣реИрдВрдбрд▓рд░ рдХреЗ рд╕рднреА рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд░реЗред рдпрд╣ рдХрд╛рдо http.Server рджреНрд╡рд╛рд░рд╛ рдЖрд╕рд╛рдиреА рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдирд┐рдореНрди рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рд╕рд░реНрд╡рд░ рдЙрди рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ рдЬреЛ рдХрдиреЗрдХреНрд╢рди рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВред рдпрд╣, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЯреАрдПрд▓рдПрд╕ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред Http.ListenAndServer рдХреЙрд▓ рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдорд╛рдирдХ HTTP рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЕрдм рдЖрдЗрдП рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВред
рдЬреЛрдбрд╝рдирд╛ рдПрдирдХреНрд░рд┐рдкреНрдЯ рдХрд░реЗрдВ
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд╣рдорд╛рд░рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди HTTP рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкрд░ рдЪрд▓рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди HTTPS рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдХреА рдЬрд╛рддреА рд╣реИред рдЧреЛ рдореЗрдВ, рдпрд╣ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд┐рдирд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рдПрдХ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдФрд░ рдПрдХ рдирд┐рдЬреА рдХреБрдВрдЬреА рдкреНрд░рд╛рдкреНрдд рд╣реБрдИ рд╣реИ, рддреЛ рдмрд╕ рд╕рд╣реА рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдФрд░ рдХреБрдВрдЬреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде ListenAndServeTLS рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВред
http.ListenAndServeTLS(":443", "cert.pem", "key.pem", nil)
рдЖрдк рд╣рдореЗрд╢рд╛ рдмреЗрд╣рддрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдЗрдП рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд░реЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдирд╡реАрдиреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рдореБрдлреНрдд рдкреНрд░рдорд╛рдг рдкрддреНрд░ рджреЗрддрд╛ рд╣реИред рд╕реЗрд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ
autocert
рдкреИрдХреЗрдЬ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЗрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╣реИ http.Serve рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдореЗрдВ autocert.NewListener рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рдпрд╣ рд╡рд┐рдзрд┐ рдЖрдкрдХреЛ рдЯреАрдПрд▓рдПрд╕ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рдирд╡реАрдиреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ, рдЬрдмрдХрд┐ HTTP рд╕рд░реНрд╡рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИ:
http.Serve(autocert.NewListener("example.com"), nil)
рдпрджрд┐ рд╣рдо рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ
example.com рдЦреЛрд▓рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ HTTPS рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдорд┐рд▓рддреА рд╣реИ "рд╣реИрд▓реЛ, рджреБрдирд┐рдпрд╛!"ред
рдпрджрд┐ рдЖрдкрдХреЛ рдЕрдзрд┐рдХ рдЧрд╣рди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдСрдЯреЛрдХрд╛рд░реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдлрд┐рд░ рд╣рдо рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ 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 рд╕рдорд░реНрдерди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╣реИред
рдХрд╕реНрдЯрдо рдорд╛рд░реНрдЧреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛
рдорд╛рдирдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░рд╛рдЙрдЯрд░ рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рдЕрдзрд┐рдХрд╛рдВрд╢ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдорд╛рд░реНрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдиреЗрд╕реНрдЯреЗрдб рдФрд░ рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдорд╛рд░реНрдЧ, рдпрд╛ рдкреИрдЯрд░реНрди рдФрд░ рдкрде рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ
рдЧреЛрд░рд┐рд▓реНрд▓рд╛ / рдордХреНрд╕ рдФрд░
рдЧреЛ-рдЪреА / рдЪреА рд╕рдВрдХреБрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдо рд╕реАрдЦреЗрдВрдЧреЗ рдХрд┐ рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рдП - рдПрдХ рдЙрджрд╛рд╣рд░рдг рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
рд╣рдорд╛рд░реЗ рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдорд╛рд░реНрдЧреЛрдВ рд╕реЗ рдпреБрдХреНрдд рдПрдкреАрдЖрдИ / v1 / api.go рдлрд╝рд╛рдЗрд▓ рд╣реИ:
/ HelloResponse is the JSON representation for a customized message type HelloResponse struct { Message string `json:"message"` }
рд╣рдо рдореБрдЦреНрдп рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдорд╛рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдкреАрдЖрдИ / рд╡реАрдХреНрдпреВ рдЙрдкрд╕рд░реНрдЧ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред
рдЗрд╕рдХреЗ рдмрд╛рдж рд╣рдо рдЕрдкрдиреЗ рдореБрдЦреНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдПрдкреАрдЖрдИ / v1 / рдкреНрд░реАрдлрд┐рдХреНрд╕ рдмреИрдХ рдХреЗ рддрд╣рдд рдЗрд╕реЗ рдЕрдкрдиреЗ рдореБрдЦреНрдп рд░рд╛рдЙрдЯрд░ рдореЗрдВ рдорд╛рдЙрдВрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
рдЧреЛ рдореЗрдВ рдЬрдЯрд┐рд▓ рдорд╛рд░реНрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рд╕рд░рд▓рддрд╛ рдмрдбрд╝реЗ рдЬрдЯрд┐рд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреА рд╕реЗрд╡рд╛ рдХреЗ рд╕рд╛рде рд╕рдВрд░рдЪрдирд╛ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддреА рд╣реИред
рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ
рдордзреНрдпрд╡рд░реНрддреА рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдХ HTTP рд╣реИрдВрдбрд▓рд░ рдХреЛ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рд▓рдкреЗрдЯрдиреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЬрд▓реНрджреА рд╕реЗ рдкреНрд░рдорд╛рдгрд┐рдд, рд╕рдВрдкреАрдбрд╝рд┐рдд, рдЬрд░реНрдирд▓ рдФрд░ рдХреБрдЫ рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИред
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдЗрдВрдЯрд░рдлрд╝реЗрд╕ http.andler рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ, рдЗрд╕рдХреА рдорджрдж рд╕реЗ рд╣рдо рд╕реЗрд╡рд╛ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рд╣реИрдВрдбрд▓рд░ рд▓рд┐рдЦрддреЗ рд╣реИрдВред
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 }
рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рд░рд╛рдЙрдЯрд░ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЪреА, рдЬреЛ рдЖрдкрдХреЛ рдордзреНрдпрд╡рд░реНрддреА рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рд╕реНрдерд┐рд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ
рдЧреЛ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рд╕реНрдерд┐рд░ рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд┐рддреНрд░, рд╕рд╛рде рд╣реА рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рд╕реАрдПрд╕рдПрд╕ рдлрд╛рдЗрд▓реЗрдВ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЙрдиреНрд╣реЗрдВ http.FileServer рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдПрдХ рд╣реИрдВрдбрд▓рд░ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕реЗ рдлрд╛рдЗрд▓ рд╡рд┐рддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред
func NewRouter() http.Handler { router := chi.NewRouter() r.Get("/{name}", HelloName)
рдпрд╣ рдпрд╛рдж рд░рдЦрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ http.Dir рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ рдпрджрд┐ рдЗрд╕рдореЗрдВ рдореБрдЦреНрдп index.html рдлрд╝рд╛рдЗрд▓ рдирд╣реАрдВ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЛ рд╕рдордЭреМрддрд╛ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣
unindexed
рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИред
рд╢рдЯрдбрд╛рдЙрди рд╕рд╣реА
рдЧреЛ рдореЗрдВ рдПрдХ рдлреАрдЪрд░ рднреА рд╣реИ рдЬреИрд╕реЗ HTTP рд╕рд░реНрд╡рд░ рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдмрдВрдж рдХрд░рдирд╛ред рдпрд╣ рд╢рдЯрдбрд╛рдЙрди () рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕рд░реНрд╡рд░ рдЧреЛрд░рдЖрдЙрдЯ рдореЗрдВ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЪреИрдирд▓ рдХреЛ рдПрдХ рд░реБрдХрд╛рд╡рдЯ рд╕рдВрдХреЗрдд рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬреИрд╕реЗ рд╣реА рд╕рд┐рдЧреНрдирд▓ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рд╕рд░реНрд╡рд░ рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рддреБрд░рдВрдд рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдХреБрдЫ рд╕реЗрдХрдВрдб рдХреЗ рдмрд╛рджред
handler := server.NewRouter() srv := &http.Server{ Handler: handler, } go func() { srv.Serve(autocert.NewListener(domains...)) }()
рдирд┐рд╖реНрдХрд░реНрд╖ рдореЗрдВ
рдЧреЛ рд▓рдЧрднрдЧ рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕рд╛рде рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рднрд╛рд╖рд╛ рд╣реИред рдЗрд╕рдХреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреНрд╖рдорддрд╛рдПрдВ рдмрд╣реБрдд рд╡реНрдпрд╛рдкрдХ рд╣реИрдВ, рдФрд░ рдЖрдк рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА рдорджрдж рд╕реЗ рдЙрдиреНрд╣реЗрдВ рдордЬрдмреВрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдпрд╣ рдЖрдкрдХреЛ рд╕рд╣реА рдорд╛рдпрдиреЗ рдореЗрдВ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп HTTP- рд╕рд░реНрд╡рд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рд╕реНрдХрд┐рд▓рдмреЙрдХреНрд╕ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реИ: