这篇文章主要介绍“Go语言如何实现关闭http请求”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Go语言如何实现关闭http请求”文章能帮助大家解决问题。
面试的时候问到如何关闭http请求,一般人脱口而出的是关闭response.body,这是错误的。response是返回结果的一个结构体,跟http连接没有关系。
type Response struct { Status string // e.g. "200 OK" StatusCode int // e.g. 200 Proto string // e.g. "HTTP/1.0" ProtoMajor int // e.g. 1 ProtoMinor int // e.g. 0 Header Header Body io.ReadCloser ContentLength int64 Close bool Uncompressed bool Trailer Header Request *Request TLS *tls.ConnectionState }
Body是Response中定义的一个IO流,用来读取返回内容。调用完成之后,无论http连接是否需要关闭,都要关闭response.body。
设置之后req.Close = true
,每次请求结束后就会主动关闭连接
func main() { req, err := http.NewRequest("GET", "http://www.baidu.com", nil) checkError(err) req.Close = true resp, err := http.DefaultClient.Do(req) if resp != nil { defer resp.Body.Close() } checkError(err) body, err := ioutil.ReadAll(resp.Body) checkError(err) fmt.Println(string(body)) } func checkError(err error) { if err != nil { fmt.Printf("err:%+v\n", err) } }
设置req.Header.Add("Connection", "close")
之后,然后服务器返回的响应头部也会有这个选项,此时 HTTP 标准库会主动断开连接
func main() { req, err := http.NewRequest("GET", "http://www.baidu.com", nil) checkError(err) req.Header.Add("Connection", "close") resp, err := http.DefaultClient.Do(req) if resp != nil { defer resp.Body.Close() } checkError(err) body, err := ioutil.ReadAll(resp.Body) checkError(err) fmt.Println(string(body)) } func checkError(err error) { if err != nil { fmt.Printf("err:%+v\n", err) } }
这个主要是用来取消 HTTP 全局的复用连接,调用解释之后会自动关闭http连接
func main() { tr := http.Transport{DisableKeepAlives: true} client := http.Client{Transport: &tr} resp, err := client.Get("http://www.baidu.com") checkError(err) if resp != nil { defer resp.Body.Close() } body, err := ioutil.ReadAll(resp.Body) checkError(err) fmt.Println(string(body)) } func checkError(err error) { if err != nil { fmt.Printf("err:%+v\n", err) } }
关于“Go语言如何实现关闭http请求”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注亿速云行业资讯频道,小编每天都会为大家更新不同的知识点。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。