Go語言實現http共享(總結)


go語言入門簡單,可要寫出好的go代碼得需要下些功夫。

前兩天剛把http文件共享的升級過(http://www.cnblogs.com/MikeZhang/archive/2012/08/06/httpShareGolang20120805.html ),現在經大牛指點完全用http實現,感覺爽快多了。 

一個簡單的http服務器代碼 

package main
import (
 "io"
 "net/http"
 "log"
)
func HelloServer(w http.ResponseWriter, req *http.Request) {
 io.WriteString(w, "hello, world!\n")
}
func main() {
 http.HandleFunc("/hello", HelloServer)
 err := http.ListenAndServe(":12345", nil)
 if err != nil {
 log.Fatal("ListenAndServe: ", err)
 }
} 

這里調用的是 http.HandleFunc函數,這個函數聲明如下: 

func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) 

這里用HelloServer實現HandleFunc函數的第二個參數。 

一個簡單的http服務器計數器程序代碼 

package main
import (
 "fmt"
 "net/http"
 "log"
)
type Counter struct {
 n int
}
func (ctr *Counter) ServeHTTP(c http.ResponseWriter, req *http.Request) {
 ctr.n++
 fmt.Fprintf(c, "counter = %d\n", ctr.n)
}
func main() {
 http.Handle("/counter", new(Counter))
 log.Fatal("ListenAndServe: ", http.ListenAndServe(":12345", nil))
} 

這里調用的是http.Handle函數,這個函數聲明如下: 

func Handle(pattern string, handler Handler) 

說明:幾乎任何東西都可加以方法,幾乎任何東西都可滿足某界面,http包定義的Handler界面就是這樣,任何物件實現了Handler都可服務 HTTP請求。 

type Handler interface { 

ServeHTTP(ResponseWriter, *Request) 

} 

ResponseWriter 本身是個界面,它提供一些可訪問的方法來返回客戶的請求。這些方法包括標准的 Write 方法。因此 http.ResponseWriter 可用在io.Writer 可以使用的地方。Request 是個結構,包含客戶請求的一個解析過的表示。 

所以這里只要給 Counter實現ServeHTTP方法就可以服務HTTP請求了。 

上面的兩個例子是http服務器的兩種方式,寫出來主要是為了對比下。 

兩種方式都實現了類似這樣的函數: handler func(ResponseWriter, *Request),但是第一個例子的函數名字不固定,可以隨便起,第二個例子中的函數名字只能是ServeHTTP,其它的不行。

實現http文件共享 

文件服務器要用到 http.FileServer提供的Handler,下面的代碼就是基於第二種方式實現的。這里就不多解釋了,不懂的參考上面的例子,比較下或許有幫助。 

源代碼如下: 

/*
File : httpShareWithTrace.go
Author : Mike
E-Mail : Mike_Zhang@live.com
*/
package main
import (
 "net/http"
 "os"
 "strings"
 "log"
)
type TraceHandler struct {
 h http.Handler
}
func (r TraceHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
 println("get",req.URL.Path," from ",req.RemoteAddr)
 r.h.ServeHTTP(w, req)
}
func main() {
 port := "8080"//Default port 
 if len(os.Args)>1 { port = strings.Join(os.Args[1:2],"")}
 h := http.FileServer(http.Dir("."))
 http.Handle("/", TraceHandler{h})
 println("Listening on port ",port,"...")
 log.Fatal("ListenAndServe: ", http.ListenAndServe(":"+port, nil))
}

啟動應用程序: 

 Web訪問: 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM