首页 > 其他分享 >http请求超时 ,你用golang是如何解决的

http请求超时 ,你用golang是如何解决的

时间:2024-09-30 10:35:05浏览次数:6  
标签:HTTP 请求 err fmt golang http 超时

http请求超时 ,你用golang是如何解决的?

原创 磊丰 Go语言圈    2024年09月30日 08:30 广东 听全文 Go语言圈 Go语言开发者的学习好助手,分享Go语言知识,技术技巧,学习与交流Go语言开发经验,互动才有助于技术的提升,每天5分钟,助你GO语言技术快乐成长 195篇原创内容 公众号

最近在学习Golang,所以将学习过程记为笔记,以后翻阅的时候也方便,顺便也给大家做一点分享,希望能坚持下去。

 

获取GoLand激活码:https://web.52shizhan.cn

学习与交流:Go语言技术交流微信群

 

现在就开始你的Go语言学习之旅吧!人生苦短,let’s Go.

 


图片

图片

在Golang中,当进行HTTP请求时,处理超时是很重要的,尤其在网络不稳定或服务器响应缓慢的情况下。Golang提供了灵活的方式来处理HTTP请求的超时问题。常见的方式有通过设置http.Client的超时属性、使用上下文(context.Context)进行超时控制,以及使用自定义的http.Transport

解决HTTP请求超时的几种方式

1. 使用 http.Client 的超时设置

Golang 的 http.Client 有一个 Timeout 字段,可以用来控制整个请求的超时时间。如果该时间内没有得到响应,请求就会自动取消,并返回超时错误。

》》》程序员的福利《《《

 

图片

 

package main
import ( "fmt" "net/http" "time")
func main() { // 创建一个带有超时的 HTTP 客户端 client := &http.Client{ Timeout: 5 * time.Second, // 设置请求超时时间为 5 秒 }
// 发起 HTTP GET 请求 resp, err := client.Get("https://example.com") if err != nil { fmt.Println("Request failed:", err) return } defer resp.Body.Close()
fmt.Println("Response status:", resp.Status)}
  • Timeout: 该字段控制整个请求的超时时间,包括连接建立、发送请求、读取响应的总时间。如果超过设定时间,HTTP请求将超时。

2. 使用 context.Context 控制请求超时

context.Context 提供了一种更精细的控制方式,允许对请求的某些部分(如连接、读取响应等)进行超时控制。

package main
import ( "context" "fmt" "net/http" "time")
func main() { // 创建一个带有 5 秒超时的上下文 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() // 请求完成后调用 cancel() 释放资源
// 创建请求 req, err := http.NewRequestWithContext(ctx, "GET", "https://example.com", nil) if err != nil { fmt.Println("Request creation failed:", err) return }
// 创建一个 HTTP 客户端并发送请求 client := &http.Client{} resp, err := client.Do(req) if err != nil { fmt.Println("Request failed:", err) return } defer resp.Body.Close()
fmt.Println("Response status:", resp.Status)}

 

  • context.WithTimeout: 创建一个带有超时限制的上下文,该上下文会在超时时间到达后自动取消请求。

  • http.NewRequestWithContext: 创建一个包含上下文的请求,以便可以精确控制请求的超时行为。

     

3. 使用 http.Transport 来控制连接和响应的超时

http.Client 使用了 http.Transport 来管理 HTTP 连接的底层实现,通过设置 http.Transport 可以更细粒度地控制超时行为,比如设置连接超时、TLS握手超时、请求响应超时等。

 

package main
import ( "fmt" "net" "net/http" "time")
func main() { // 自定义 HTTP Transport transport := &http.Transport{ DialContext: (&net.Dialer{ Timeout: 5 * time.Second, // 连接超时时间 }).DialContext, TLSHandshakeTimeout: 5 * time.Second, // TLS 握手超时时间 IdleConnTimeout: 90 * time.Second, // 空闲连接超时时间 }
// 创建带有自定义 Transport 的 HTTP 客户端 client := &http.Client{ Transport: transport, Timeout: 10 * time.Second, // 总超时时间(包括连接、TLS握手、请求和响应) }
// 发起 HTTP GET 请求 resp, err := client.Get("https://example.com") if err != nil { fmt.Println("Request failed:", err) return } defer resp.Body.Close()
fmt.Println("Response status:", resp.Status)}

 

常见的HTTP请求超时场景

  1. 连接超时:通过DialContext设置连接建立的超时时间,避免因为网络连接问题导致的长时间等待。

     

  2. 读取超时:通过Timeout字段或上下文控制整体读取时间,防止服务器长时间不响应导致的阻塞。

     

  3. 响应时间过长:如果服务器响应过慢(如传输数据时延迟过大),可以通过控制http.Client.Timeoutcontext.Context来确保应用不会无限期等待。

总结

在Golang中,处理HTTP请求超时可以通过以下几种方式:

  • 使用http.ClientTimeout字段控制整体请求的超时时间。

  • 使用context.Context来进行更灵活的超时管理。

  • 通过自定义http.Transport来精细化控制连接、TLS握手等各个阶段的超时。

根据具体的需求,选择合适的方式来实现HTTP请求的超时处理,可以提高应用的健壮性,避免长时间的阻塞或无响应。

 

 

参考链接:

更多相关Go语言的技术文章或视频教程,请关注本公众号获取并查看,感谢你的支持与信任!

golang文章集合26 golang文章集合 · 目录 上一篇golang是怎么使用反射的?我们来谈谈反射的优缺点 阅读 569   ​

标签:HTTP,请求,err,fmt,golang,http,超时
From: https://www.cnblogs.com/cheyunhua/p/18441353

相关文章

  • 转载 fastapi 部署 原文链接:https://blog.csdn.net/FrenzyTechAI/article/details/132
    sudoadd-apt-repositoryppa:deadsnakes/ppasudoaptupdatesudoaptinstallpython3.12python3.12-venv-ysudoaptinstallsupervisorsudoaptinstallsupervisornginx-y启用并启动Supervisor:sudosystemctlenablesupervisorsudosystemctlstartsupervisor使用ena......
  • 转载 https://blog.csdn.net/h1773655323/article/details/142098658#:~:text=%E7%94%
    在Ubuntu20.04上安装Python3.12:详细教程写bug如流水于2024-09-1014:41:34发布阅读量837收藏11点赞数4分类专栏:Python文章标签:ubuntupythonlinux版权Python专栏收录该内容53篇文章7订阅订阅专栏今天这篇文章将指导您如何在Ubuntu20.04上安装Python3.12......
  • HTTP协议
    目录一、引言二、HTTP协议原理  1.HTTP协议概述  2.HTTP请求与响应过程三、HTTP协议特性  1.无状态性  2.可扩展性  3.简洁性  4.支持多种请求方法四、HTTP协议实践  1.抓包工具  2.编写HTTP客户端  3.搭建HTTP服务器  4.HTTP协议......
  • pbootcms后台UEditor编辑器默认给magnet、ed2k等链接加http://的解决问题
    在PbootCMS中,使用UEditor编辑器添加磁力链接(magnet:)或电驴链接(ed2k:)时,编辑器会自动添加http://前缀,导致链接无法正常使用。可以通过修改UEditor编辑器的相关文件来解决这个问题。解决方法步骤1:修改UEditor编辑器文件打开文件:打开core/extend/ueditor/dialogs/link/link.ht......
  • C# Task 实现任务超时取消、超时取消然后重试 超过重试最大次数就结束。
    C#Task实现任务超时取消、超时取消然后重试超过重试最大次数就结束。 任务超时取消示例publicstaticasyncTaskTimeoutCancelTask(){CancellationTokenSourcects=newCancellationTokenSource();//取消令牌Tasktask......
  • Python3开启自带http服务
    有时候需要在局域网的电脑之间传送一些东西,或者在虚拟机之间传送一些东西。如果电脑上有安装了Python的话,其实非常方便,可以临时搭建一个HTTP服务器传送东西,一句命令就搞定了。而且这东西本身是Python内置的功能。1.基本方式Python中自带了简单的服务器程序,能较容易地打开服务......
  • 内网IP地址配置SSL证书实现HTTPS加密访问教程
    很多小伙伴需要内网IP地址也实现HTTPS加密,而就目前来说,支持内网IP地址https加密的SSL证书有锐安信、CFCA等,当我们获取到内网IPSSL证书后,需要在服务器(常见类型如Nginx,Apache,Tomcat,IIS等)上完成配置。其实内网IP地址实现https认证的过程与域名SSL证书安装教程类似,我们在前面的教......
  • 公网内网IP地址申请SSL证书实现HTTPS加密指南
    如今,HTTPS已经成为安全保障网站的首要选择,而获得SSL证书则是实现HTTPS加密的先决条件。众所周知,SSL证书能为域名网站实现HTTPS加密,但有些企事业单位的网站仅支持IP地址访问,那么IP地址想要实现HTTPS加密又该如何申请SSL证书呢?公网内网IP地址都可以申请吗?需要哪些条件呢?请看下文......
  • golang shell
    packageshellimport( "context" "fmt" "os/exec" "time")//自定义输出结构体typecustomOutputstruct{ outPutchanstring resetCtxchanstruct{}}//Write将输出写入到customOutput结构体中,并通知重置超时。func(ccustomOutput......
  • CMake构建学习笔记18-cpp-httplib库的构建
    cpp-httplib库是笔者认为的一个比较好用的基于C++的Http服务器组件,与Eigen一样,它也是基于头文件的库,我们只需要引入httplib.h这个头文件进行来就实现所有基于http/https协议的功能,非常适合初学者进行使用。尽管是头文件,还是可以使用CMake进行构建,便于统一管理,关键脚本如下:#配置......