Go Web 程式設計之 Hello World

mug發表於2021-09-09

概述

計劃寫一個講 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.HandleFunchello函式註冊到根路徑/上,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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章