为了账号安全,请及时绑定邮箱和手机立即绑定

如何在golang的Web应用程序中缓冲响应?

如何在golang的Web应用程序中缓冲响应?

Go
江户川乱折腾 2021-11-08 15:42:06
我想制作一个可以正确捕获模板错误的 hello world Web 应用程序。所以我需要缓冲响应但不知道该怎么做。我已经把这段代码放在一起了。这是在 golang 中缓冲响应的方式吗?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()))}
查看完整描述

3 回答

?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

bytes.Buffer有一个Bytes方法,因此您实际上不需要调用String并将其转换为[]byte:


w.Write(buf.Bytes())

此外,将错误写入 stderr 是一种很好的做法。只需将您的替换fmt为log:


if err != nil {

    log.Println(err)

    http.Error(w, err.Error(), http.StatusInternalServerError)

    return

}


查看完整回答
反对 回复 2021-11-08
?
慕村225694

TA贡献1880条经验 获得超4个赞

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


查看完整回答
反对 回复 2021-11-08
?
婷婷同学_

TA贡献1844条经验 获得超8个赞

您可以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库。


查看完整回答
反对 回复 2021-11-08
  • 3 回答
  • 0 关注
  • 171 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信