GoLang之搭建Web伺服器
2014-02-05 wcdj
0 摘要
之前總結過如何使用Perl搭建Web服務《》。本文介紹如何使用GoLang搭建Web服務,Go語言提供了一個完善的net/http包,通過這個http包可以很方便搭建一個可以執行的Web服務,同時使用這個包能很簡單地對Web的路由,靜態檔案,模板,Cookie等資料進行設定和操作。
1 測試程式碼一
http_svr.go
package main import ( "fmt" "log" "net/http" "strings" ) func sayhelloName(w http.ResponseWriter, r *http.Request) { // 解析引數, 預設是不會解析的 r.ParseForm() // 這些資訊是輸出到伺服器端的列印資訊 fmt.Println("request map:", r.Form) fmt.Println("path", r.URL.Path) fmt.Println("scheme", r.URL.Scheme) fmt.Println(r.Form["url_long"]) for k, v := range r.Form { fmt.Println("key:", k) fmt.Println("val:", strings.Join(v, ";")) } // 這個寫入到w的資訊是輸出到客戶端的 fmt.Fprintf(w, "Hello gerryyang!\n") } func main() { // 設定訪問的路由 http.HandleFunc("/", sayhelloName) // 設定監聽的埠 err := http.ListenAndServe(":9090", nil) if err != nil { log.Fatal("ListenAndServe: ", err) } }
2 測試用例一
(1) 在瀏覽器輸入:http://localhost:9090/,則:
瀏覽器輸出:
Hello gerryyang!
http_svr輸出:
request map: map[]
path /
scheme
[]
(2) 在終端使用curl命令測試。
curl "http://localhost:9090/?url_long=111&url_long=222&name=gerryyang&gender=male"
終端輸出:
Hello gerryyang!
http_svr輸出:
request map: map[url_long:[111 222] name:[gerryyang] gender:[male]]
path /
scheme
[111 222]
key: url_long
val: 111;222
key: name
val: gerryyang
key: gender
val: male
3 測試程式碼二
package main import ( "fmt" "net/http" ) type MyMux struct { } func (p *MyMux) ServeHTTP(w http.ResponseWriter, r *http.Request) { if r.URL.Path == "/" { sayhelloName(w, r) return } http.NotFound(w, r) return } func sayhelloName(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello gerryyang, version 2!\n") } func main() { mux := &MyMux{} http.ListenAndServe(":9090", mux) }
4 測試用例二
[email protected]:go_web$curl "http://localhost:9090/?url_long=111&url_long=222&name=gerryyang&gender=male"
Hello gerryyang, version 2!
[email protected]:go_web$curl "http://localhost:9090/aa?url_long=111&url_long=222&name=gerryyang&gender=male"
404 page not found
5 小結
用例一,使用GoLang編寫Web服務只要呼叫http包的兩個函式,不依賴nginx,apache伺服器。
6 原理分析
GoLang實現Web服務的流程如下:
(1) 建立Listen Socket,監聽指定的埠,等待客戶端(大黃鴨)請求到來;
(2) Listen Socket接受客戶端的請求,得到Client Socket,接下來通過Client Socket與客戶端通訊;
(3) 處理客戶端的請求,首先從Client Socket讀取HTTP請求的協議頭,如果是POST方法,還可能要讀取客戶端提交的資料,然後交給相應地handler處理請求,handler處理完畢準備好客戶端需要的資料,通過Client Socket寫給客戶端;