這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。> 如何使用 Go 啟動新的 Web 項目,使用路由,中介軟體和讓我們加密認證。Golang 有一個很棒的內建 http 伺服器軟體包,不用說就是: net/http, 它非常簡單,但是功能非常強大。 定義處理路由的函數,連接埠是 80。```gopackage mainimport ("io""net/http")func main() {http.HandleFunc("/", helloWorldHandler)http.ListenAndServe(":80", nil)}func helloWorldHandler(w http.ResponseWriter, r *http.Request) {io.WriteString(w, "Hello world!")}```不錯,但是我們可以使用一個更加強大的路由器,比如 Gorilla 包:`gorilla/mux` [http://www.gorillatoolkit.org/pkg/mux](http://www.gorillatoolkit.org/pkg/mux)它實現了一個請求路由器和一個調度器。 它允許您建立具有具名引數的路由,限制 HTTP 動詞(譯註:即限制為 GET、POST 等)和主機或網域名稱管理。![img](https://raw.githubusercontent.com/studygolang/gctt-images/master/Golang-HTTP-server-for-pro/Gorilla-Routing-in-action.gif) Gorilla Routing in action! 大猩猩路由在行動!通過簡單的配置就可以輕鬆管理更多路由在之前的例子上使用 Gorilla,使我們能夠使用簡單配置輕鬆管理多條路線:```gofunc main() {r := mux.NewRouter()r.HandleFunc("/products/{key}", ProductHandler)r.HandleFunc("/articles/{category}/", ArticlesCategoryHandler)r.HandleFunc("/articles/{category}/{id:[0-9]+}", ArticleHandler)http.Handle("/", r)}```## 使用 `Alice` 來管理我們的中介軟體如果您使用網路伺服器軟體包,[中介軟體模式](https://en.wikipedia.org/wiki/Middleware)非常常見。 如果您還沒有看到它,您應該在 201 5年 Golang UK Conference 上觀看Mat Ryer 的視頻,瞭解中介軟體的強大功能。([完整的部落格文章在這裡](https://medium.com/@matryer/writing-middleware-in-golang-and-how-go-makes-it-so-much-fun-4375c1246e81))視頻連結:https://youtu.be/tIm8UkSf6RA另一篇關於中介軟體模式的文章[http://www.alexedwards.net/blog/making-and-using-middleware](http://www.alexedwards.net/blog/making-and-using-middleware)正如作者的描述([Github](https://github.com/justinas/alice)):> `Alice` 提供了一種便捷的方式來連結您的HTTP中介軟體功能和應用程式處理常式。簡單說,它把```goMiddleware1(Middleware2(Middleware3(App)))```轉換到```goalice.New(Middleware1, Middleware2, Middleware3).Then(App)```我們的第一個例子,加上 `Alice` 之後:```gofunc main() {errorChain := alice.New(loggerHandler, recoverHandler)r := mux.NewRouter()r.HandleFunc("/products/{key}", ProductHandler)r.HandleFunc("/articles/{category}/", ArticlesCategoryHandler)r.HandleFunc("/articles/{category}/{id:[0-9]+}", ArticleHandler)http.Handle("/", errorChain.then(r))}```你可以串聯許多 `handler`,如下描述了兩個:```gofunc loggerHandler(h http.Handler) http.Handler {return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {start := time.Now()h.ServeHTTP(w, r)log.Printf("<< %s %s %v", r.Method, r.URL.Path, time.Since(start))})}````loggerHandler` 和 `recoverHandler`:```gofunc recoverHandler(next http.Handler) http.Handler {fn := func(w http.ResponseWriter, r *http.Request) {defer func() {if err := recover(); err != nil {log.Printf("panic: %+v", err)http.Error(w, http.StatusText(500), 500)}}()next.ServeHTTP(w, r)}return http.HandlerFunc(fn)}```現在,我們有一個配有強大的路由包的 HTTP 伺服器。 您還可以輕鬆管理中介軟體,以快速擴充應用程式的功能。![img](https://raw.githubusercontent.com/studygolang/gctt-images/master/Golang-HTTP-server-for-pro/Midlleware-everywhere-with-Alice.gif)Alice 使中介軟體無處不在!***## HTTP 伺服器不錯,但 HTTPS 伺服器更好!使用 `Let's Encrypt` 服務,簡單快捷的建立一個安全的HTTP伺服器 。 `Let's Encrypt` 使用 [ACME協議](https://en.wikipedia.org/wiki/Automated_Certificate_Management_Environment) 來驗證您是否控制指定的網域名稱並向您頒發認證。 這就是所謂的認證,是的,有一個自動認證軟體包:[acme / autocert](https://godoc.org/golang.org/x/crypto/acme/autocert)```gom := autocert.Manager{Prompt: autocert.AcceptTOS,HostPolicy: autocert.HostWhitelist("www.checknu.de"),Cache: autocert.DirCache("/home/letsencrypt/"),}```使用 `tls` 建立 `http.server`:```goserver := &http.Server{Addr: ":443",TLSConfig: &tls.Config{GetCertificate: m.GetCertificate,},}err := server.ListenAndServeTLS("", "")if err != nil {log.Fatal("ListenAndServe: ", err) }```![img](https://raw.githubusercontent.com/studygolang/gctt-images/master/Golang-HTTP-server-for-pro/And-now-its-done.png)完成了!
via: https://medium.com/@ScullWM/golang-http-server-for-pro-69034c276355
作者:Thomas P 譯者:wentingrohwer 校對:polaris1119
本文由 GCTT 原創編譯,Go語言中文網 榮譽推出
本文由 GCTT 原創翻譯,Go語言中文網 首發。也想加入譯者行列,為開源做一些自己的貢獻嗎?歡迎加入 GCTT!
翻譯工作和譯文發表僅用於學習和交流目的,翻譯工作遵照 CC-BY-NC-SA 協議規定,如果我們的工作有侵犯到您的權益,請及時聯絡我們。
歡迎遵照 CC-BY-NC-SA 協議規定 轉載,敬請在本文中標註並保留原文/譯文連結和作者/譯者等資訊。
文章僅代表作者的知識和看法,如有不同觀點,請樓下排隊吐槽
348 次點擊