Go Web 編程之 Hello World

概述

計劃寫一個講 Go Web 編程的系列文章。從基於 net/http 包編寫 Go Web 程序開始,講述處理器,請求,響應等基礎知識。而後到框架的使用。中間會穿插一些源碼的分析。最後作一個實戰項目。html

目前 Go 社區已經有很是多關於 Web 開發的庫或框架。大而全的有beegorevel。超高性能的有echofasthttpgin(目前 GitHub 星標最多)。還有很多專一於具體某個方面的,最多要屬路由了,例如:mux/httproutergit

那爲何還要從最原始的 net/http 包開始學起?由於這些庫/框架大可能是基於 net/http 包作了包裝,提供易於使用的功能,如路由參數(/:name/:age)/路由分組等。熟練掌握了基礎知識和 net/http,學習其餘框架必然能有事半功倍的效果。不論是快速上手使用庫和框架,仍是深刻閱讀源碼,都能駕輕就熟。github

HTTP

HTTP 協議是整個互聯網的基石。無論技術,產品仍是運營,甚至是非互聯網行業的人,天天都在與 HTTP 協議打交道。咱們天天瀏覽網頁都在使用 HTTP。如今不少 APP 也都在內部使用 HTTP 與服務器交互。因此學習 Web 編程,HTTP 協議是必需要掌握的。golang

HTTP 是一個無狀態的,基於文本的協議。它靈活,穩定,強大。自 1991 年發佈以來只進行了幾回修訂。下面是 HTTP 發展簡史:web

  • 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框架

第三個部分爲一個空行。注意,即便沒有首部,後面的空行也不能省略socket

最後爲一個可選的報文主體。若是有主體,服務器會根據首部中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 請求的內容。

參考資料

  1. Go Web 編程
  2. HTTP 響應碼
相關文章
相關標籤/搜索