缓冲控制

接口文档:https://godoc.org/github.com/gogf/gf/net/ghttp#Response

Response输出采用了缓冲控制,输出的内容预先写入到一块缓冲区,等待服务方法执行完毕后才真正地输出到客户端。该特性在提高执行效率同时为输出内容的控制提供了更高的灵活性。

相关方法:

  1. func (r *Response) Buffer() []byte
  2. func (r *Response) BufferString() string
  3. func (r *Response) BufferLength() int
  4. func (r *Response) SetBuffer(data []byte)
  5. func (r *Response) ClearBuffer()
  6. func (r *Response) Output()

其中Output作用类似于Flush将缓冲区的数据输出到客户端并清空缓冲区。

举个例子:

我们通过后置中间件统一对返回的数据做处理,如果服务方法产生了异常,那么不能将敏感错误信息推送到客户端,而统一设置错误提示信息。

  1. package main
  2. import (
  3. "github.com/gogf/gf/frame/g"
  4. "github.com/gogf/gf/net/ghttp"
  5. "net/http"
  6. )
  7. func MiddlewareErrorHandler(r *ghttp.Request) {
  8. r.Middleware.Next()
  9. if r.Response.Status >= http.StatusInternalServerError {
  10. r.Response.ClearBuffer()
  11. r.Response.Writeln("服务器居然开小差了,请稍后再试吧!")
  12. }
  13. }
  14. func main() {
  15. s := g.Server()
  16. s.Group("/api.v2", func(group *ghttp.RouterGroup) {
  17. group.Middleware(MiddlewareErrorHandler)
  18. group.ALL("/user/list", func(r *ghttp.Request) {
  19. panic("db error: sql is xxxxxxx")
  20. })
  21. })
  22. s.SetPort(8199)
  23. s.Run()
  24. }

访问 http://127.0.0.1:8199/api.v2/user/list 可以看到,页面输出了:

  1. 服务器居然开小差了,请稍后再试吧!