Go Web 程式設計之 Hello World
概述
計劃寫一個講 Go Web 程式設計的系列文章。從基於 net/http 包編寫 Go Web 程式開始,講述處理器,請求,響應等基礎知識。然後到框架的使用。中間會穿插一些原始碼的分析。最後做一個實戰專案。
目前 Go 社群已經有非常多關於 Web 開發的庫或框架。大而全的有,。超高效能的有,,(目前 GitHub 星標最多)。還有不少專注於具體某個方面的,最多要屬路由了,例如:/。
那為什麼還要從最原始的 net/http 包開始學起?因為這些庫/框架大多是基於 net/http 包做了包裝,提供易於使用的功能,如路由引數(/:name/:age
)/路由分組等。熟練掌握了基礎知識和 net/http,學習其他框架必然能有事半功倍的效果。不管是快速上手使用庫和框架,還是深入閱讀原始碼,都能得心應手。
HTTP
HTTP 協議是整個網際網路的基石。不管技術,產品還是運營,甚至是非網際網路行業的人,每天都在與 HTTP 協議打交道。我們每天瀏覽網頁都在使用 HTTP。現在很多 APP 也都在內部使用 HTTP 與伺服器互動。所以學習 Web 程式設計,HTTP 協議是必須要掌握的。
HTTP 是一個無狀態的,基於文字的協議。它靈活,穩定,強大。自 1991 年釋出以來只進行了幾次修訂。下面是 HTTP 發展簡史:
- 1991 年,HTTP 的第一個版本 0.9 由 Tim Berners-Lee 建立。最初只有一個方法 GET,而且規定伺服器返回的只能是 HTML 格式的資料。
- 1996 年,HTTP 1.0 釋出,支援了 POST 和 HEAD 方法。
- 1999 年,HTTP 1.1 釋出,新增了 PUT/DELETE/OPTIONS/TRACE/CONNECT 這 5 個方法,並允許開發者自行新增更多方法。
- 2015 年,HTTP 2.0 釋出,為提升效能做出了不少修改,如採用二進位制格式,完全多路複用。
HTTP 是一種請求——響應模式的協議,所有操作以一個請求開始,以一個響應結束。
HTTP 請求
HTTP 請求的格式非常簡單。一個請求由以下 4 個部分組成:
- 請求行(request-line);
- 零個或多個首部(header);
- 一個空行;
- 一個可選的報文主體(body)。
第一個重要的部分為請求行,其格式如下:
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
。
第三個部分為一個空行。注意,即使沒有首部,後面的空行也不能省略。
最後為一個可選的報文主體。如果有主體,伺服器會根據首部中Content-Type
指定的格式來解析這部分內容。
HTTP 響應
HTTP 響應的格式與請求非常相似。一個響應由以下 4 個部分組成:
- 響應行(response line);
- 零個或多個首部(header);
- 一個空行;
- 一個可選的報文主體(body)。
響應行的格式為:
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
:此請求方法不被伺服器支援。
-
第一個 Go Web 程式
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 請求的內容。
參考資料
本文由部落格一文多發平臺 釋出!
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/506/viewspace-2824716/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Flutter Web 之 Hello WorldFlutterWeb
- Go - Hello WorldGo
- Go:Hello WorldGo
- Cangjie—倉頡程式設計-Hello,World程式設計
- [系列] Go gRPC Hello WorldGoRPC
- Linux下第一個程式設計,hello world!Linux程式設計
- Go Web 程式設計之 資料庫GoWeb程式設計資料庫
- gRPC-go 入門(1):Hello WorldRPCGo
- React 學習之 Hello WorldReact
- Spring-Cloud之hello worldSpringCloud
- 深入分析 Hello World 程式
- 第一個程式Hello world
- Hello, World
- Hello,World
- Hello World
- Hello World!
- Hello World !
- 第一個ncurses程式: hello world !!!
- 《快學 Go 語言》第 1 課 —— Hello WorldGo
- 嘿,程式設計師!手把手教你寫出智慧合約”Hello,World”程式設計師
- Deep "Hello world!"
- Hello Python worldPython
- Hello World探究
- Docker Hello WorldDocker
- dotnet hello world
- ant Hello World
- 使用Golang語言編寫Hello World Web應用GolangWeb
- I'm Hello World
- 輸出hello world
- RabbitMQ tutorial - "Hello world!"MQ
- WebGL 的 Hello WorldWeb
- react的”Hello World !“React
- Rust使用Tauri開發GUI程式——Hello WorldRustGUI
- Threes.js入門篇之2 - Hello WorldJS
- Hello World! XJ is here.
- 01-C++ "hello world"C++
- python輸出hello worldPython
- C# Hello,World(1)