1. 程式人生 > >GoLang之搭建Web伺服器

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寫給客戶端;


7 參考