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

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

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

总结

以上是内存溢出为你收集整理的golang捕获http.ResponseWriter被close的两种方式(有无context)全部内容,希望文章能够帮你解决golang捕获http.ResponseWriter被close的两种方式(有无context)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1287436.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存