2015-09-14 70 views
2

我想製作一個hello world web應用程序,它將正確捕捉模板錯誤。所以我需要緩衝響應,但不知道如何去做。我把這些代碼放在一起。這是緩衝golang響應的方式嗎?如何在golang中的web應用中緩存響應?

func get_handler(w http.ResponseWriter, r *http.Request) { 

    buf := new(bytes.Buffer) 
    err := templates.ExecuteTemplate(buf, "hello.html", nil) 
    if err != nil { 
     fmt.Println(err.Error()) 
     http.Error(w, err.Error(), http.StatusInternalServerError) 
     return 
    } 
    w.Write([]byte(buf.String())) 
} 

回答

4

bytes.BufferBytes方法,所以你實際上並不需要調用String並將其轉換爲[]byte

w.Write(buf.Bytes()) 

此外,這是一個很好的做法,錯誤寫入標準錯誤。只需更換您的fmtlog

if err != nil { 
    log.Println(err) 
    http.Error(w, err.Error(), http.StatusInternalServerError) 
    return 
} 
2

bytes.Buffer有寫出一個io.Writer一個內置的方法:

func get_handler(w http.ResponseWriter, r *http.Request) { 
    buf := new(bytes.Buffer) 

    //fill buffer 

    _,err := buf.WriteTo(w) 
    if err != nil { 
     log.Println(err) 
    } 
} 

文檔:http://golang.org/pkg/bytes/#Buffer.WriteTo

2

可以使用bytes.Buffer「的是「通過寫入它,但以每次請求丟棄緩衝區爲代價。

使用匯集的方法(即安全地復位使用的內容,但保留了緩衝區)可以有一些收穫:

var bufPool *bpool.BufferPool 

func YourHandler(w http.ResponseWriter, r *http.Request) { 
    buf := bufPool.Get() 
    defer bufPool.Put(buf) 
    err := template.ExecuteTemplate(buf, "forms/create.html", user) 
    // or err := json.NewEncoder(buf).Encode(value) 
    if err != nil { 
     return err 
    } 

    buf.WriteTo(w) 
} 

它使用bpool庫。