計劃寫一個講 Go Web 編程的系列文章。從基於 net/http 包編寫 Go Web 程序開始,講述處理器,請求,響應等基礎知識。而後到框架的使用。中間會穿插一些源碼的分析。最後作一個實戰項目。html
目前 Go 社區已經有很是多關於 Web 開發的庫或框架。大而全的有beego,revel。超高性能的有echo,fasthttp,gin(目前 GitHub 星標最多)。還有很多專一於具體某個方面的,最多要屬路由了,例如:mux/httprouter。git
那爲何還要從最原始的 net/http 包開始學起?由於這些庫/框架大可能是基於 net/http 包作了包裝,提供易於使用的功能,如路由參數(/:name/:age
)/路由分組等。熟練掌握了基礎知識和 net/http,學習其餘框架必然能有事半功倍的效果。不論是快速上手使用庫和框架,仍是深刻閱讀源碼,都能駕輕就熟。github
HTTP 協議是整個互聯網的基石。無論技術,產品仍是運營,甚至是非互聯網行業的人,天天都在與 HTTP 協議打交道。咱們天天瀏覽網頁都在使用 HTTP。如今不少 APP 也都在內部使用 HTTP 與服務器交互。因此學習 Web 編程,HTTP 協議是必需要掌握的。golang
HTTP 是一個無狀態的,基於文本的協議。它靈活,穩定,強大。自 1991 年發佈以來只進行了幾回修訂。下面是 HTTP 發展簡史:web
HTTP 是一種請求——響應模式的協議,全部操做以一個請求開始,以一個響應結束。編程
HTTP 請求的格式很是簡單。一個請求由如下 4 個部分組成:瀏覽器
第一個重要的部分爲請求行,其格式以下:服務器
Method Path Version
Method
:請求的方法,表示對資源進行的操做。經常使用的方法有GET/POST/PUT/DELETE
;Path
:請求資源的路徑,如/user/info.html
;Version
:即 HTTP 的版本號,1.1 版本寫作HTTP/1.1
。第二個部分爲請求的首部,每一個首部佔一行。首部使用由冒號(:
)分隔的鍵值對錶示,如Content-Type: x-www-form-urlencoded
。框架
第三個部分爲一個空行。注意,即便沒有首部,後面的空行也不能省略。socket
最後爲一個可選的報文主體。若是有主體,服務器會根據首部中Content-Type
指定的格式來解析這部份內容。
HTTP 響應的格式與請求很是類似。一個響應由如下 4 個部分組成:
響應行的格式爲:
StatusCode Description
StatusCode
:狀態碼,表示請求狀態;Description
:對狀態碼的簡短描述。響應的首部與主體和請求的同樣,這裏就很少說了。
這裏簡單介紹一下狀態碼。HTTP 將狀態碼分爲了 5 大類,1XX/2XX/3XX/4XX/5XX
。
1XX
:情報狀態碼,又叫作信息狀態碼。服務器經過這類狀態碼告知客戶端,本身已經收到了客戶端發送的請求。幾個常見的狀態碼以下:
100 Continue
:表示服務器到目前爲止收到的內容都正常,客戶端應該繼續請求。若是已經完成,則忽略它。101 Switching Protocol
:這個狀態碼是響應客戶端的Upgrade
首部發送的,而且指示服務器也正在切換的協議。如客戶端請求切換協議,服務器將協議切換至 Websocket,就會發送該狀態碼給客戶端,而且在Upgrade
首部中填上 Websocket。2XX
:成功狀態碼。表示服務器已經收到了客戶端的請求,併成功對請求進行了處理。幾個常見的狀態碼以下:
200 OK
:這最多見的狀態碼了,表示請求成功。201 Created
:請求已成功,並所以建立了一個新的資源。3XX
:重定向狀態碼。服務器收到了請求,可是爲了完整地處理該請求,客戶端還須要執行指定的動做。通常用於 URL 重定向。幾個常見的狀態碼以下:
300 Multiple Choice
:被請求的資源有一系列可供選擇的回饋信息,每一個都有本身特定的地址。用戶或瀏覽器可自行選擇一個地址進行重定向。302 Moved Permanently
:被請求的資源已經永久移動到新的位置了。4XX
:客戶端錯誤狀態碼。表示客戶端發送的請求中有錯誤,如格式不對。常見的狀態碼以下:
404 Not Found
:最多見的狀態碼了,表示頁面不存在。405 Method Not Allowed
:請求的方法不容許。5XX
:服務器錯誤狀態碼。表示服務器因爲某些緣由沒法正確處理請求。常見的狀態碼以下:
500 Internal Server Error
:服務器遇到了不知道如何處理的狀況。501 Not Implemented
:此請求方法不被服務器支持。Talk is cheap, show me the Code!
接下來,咱們來編寫一個 Web 版本的 "Hello World" 程序。咱們將使用 Go 語言提供的 net/http 包。該包的功能十分強大,使用起來也很是方便。
$GOPATH
目錄下建立一個項目目錄go-web-example
;go-web-example
目錄下建立一個1-hello_world
程序目錄;server.go
文件,輸入下面內容:package main import ( "fmt" "log" "net/http" ) func hello(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello World") } func main() { http.HandleFunc("/", hello) if err := http.ListenAndServe(":8080", nil); err != nil { log.Fatal(err) } }
$GOPATH/go-web-example/1-hello_world
目錄,輸入命令:go run server.go
,咱們的第一個服務器程序就跑起來了。
localhost:8080
,"Hello, World"就在網頁上顯示出來了!
咱們來解析一下該程序。
http.HandleFunc
將hello
函數註冊到根路徑/
上,hello
函數咱們也叫作處理器。它接收兩個參數,第一個參數爲一個類型爲http.ResponseWriter
的接口,響應就是經過它發送給客戶端的。第二個參數是一個類型爲http.Request
的結構指針,客戶端發送的信息均可以經過這個結構獲取。
而後,http.ListenAndServe
將在 8080 端口上監聽請求,而後交由hello
處理。
因爲 net/http 包爲咱們封裝了不少細節,因此咱們的使用如此簡單。
本文簡單介紹了 HTTP 的發展簡史、HTTP 請求和響應的格式,而且編寫了第一個 Go Web 程序。做爲整個互聯網的基石,HTTP 協議的重要性怎麼形容都不爲過,是每一個開發人員都必須掌握的知識。Go 語言的 net/http 爲 Web 程序的開發封裝了不少細節。使用它來開發 Web 程序很是簡單。最後,爲了能加深學習的印象,我畫了一個腦圖。指望學完以後能造成一個完整的知識體系。
接下來,咱們來深刻學習 HTTP 請求的內容。