golang捕获http.ResponseWriter被close的两种方式(有无context)

u010026901 · · 6464 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

golang捕获http.ResponseWriter被close的两种方式(有无context)

方便被传阅,采用中文,其实习惯看英文后,发现中文对于一些问题,读起来绕口,接下来有很多也是直接照搬英文,以下几个方面简单介绍下:
- 为嘛服务端需要知道http连接被断开(客户端主动cancel)
- 最简单的方式捕获
- 当使用了context来传递信息时,如何捕获
- context捕获后,如何继续传递


需求

吐槽下自己 ,第一次用CSDN的新款编辑器很是生疏

Most web requests by design take only a few dozen milliseconds to process. But sometimes web apps need to leave a connection open for a longer period of time. And sometimes the remote client closes the connection before the server has had time to respond.

On a Go-based webserver, you can receive notifications when the HTTP connection terminates.
这讲的就很好,客户端它要是关了怎么办,咱们不能坐以待毙啊。

捕获cancel的通知

一个简单的用法
Start with an HTTP handler function, and get the channel for close notifications:

func SomeHandler(resp http.ResonseWriter, req *http.Request) {
// Normal stuff
//…

notify := resp.(CloseNotifier).CloseNotify()

go func() {
    <-notify
    lock.RLock()
    fmt.Println("HTTP connection just closed.")
    lock.RUnlock()
}()

}

当传入参数不确定是否是resp时
先做个简单的判断,采用reflect,假设resp 是你认为的http.ResponseWriter
v := reflect.ValueOf(resp)
v = reflect.Indirect(v)
for v.Kind() == reflect.Struct {
if fv := v.FieldByName(“ResponseWriter”); fv.IsValid() {
if cn, ok = fv.Interface().(http.CloseNotifier); ok {
return
}
v = reflect.Indirect(fv)
} else {
break
}
}

通知只有一次,需要向后继续传递

这是golang关于context的介绍,https://godoc.org/golang.org/x/net/context

ctx, cancel := context.WithCancel(context.Background())
当获得通知后,执行了cancel方法,如果后续操作也依赖这个通知,这时需要获得另一个信号,ctx.Done()

版权声明:本文为博主原创文章,未经博主允许不得转载。


有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:u010026901

查看原文:golang捕获http.ResponseWriter被close的两种方式(有无context)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

6464 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传