新闻中心

Golang如何使用net/http发送HTTP请求_Golang net/http HTTP请求实践详解

2025-10-31
浏览次数:
返回列表
答案:本文介绍Go语言net/http包的使用方法,涵盖GET请求、自定义Client发送POST等请求、表单数据提交、请求头与Cookie设置、重定向控制、超时配置及错误处理,强调资源释放与超时控制的重要性。

golang如何使用net/http发送http请求_golang net/http http请求实践详解

在Go语言中,net/http 包是处理HTTP客户端与服务器端编程的核心工具。使用它发送HTTP请求非常简单且高效,适用于构建API调用、微服务通信、Web爬虫等场景。本文将详细介绍如何使用 net/http 发送各种类型的HTTP请求,并提供实用代码示例。

1. 发送最基本的GET请求

最常用的HTTP方法是GET,用于从服务器获取数据。使用 http.Get() 可以快速发起一个GET请求。

resp, err := http.Get("https://httpbin.org/get")
if err != nil {
    log.Fatal(err)
}
defer resp.Body.Close()
<p>body, _ := io.ReadAll(resp.Body)
fmt.Println(string(body))</p>

注意:一定要调用 resp.Body.Close() 避免资源泄露。返回的 resp 是 *http.Response 类型,包含状态码、Header 和 Body 等信息。

2. 使用Client自定义请求(支持POST、PUT等)

对于更复杂的请求,比如POST、PUT或需要设置超时、Header等,应使用 http.Client 并手动创建 http.Request

client := &http.Client{Timeout: 10 * time.Second}
<p>data := strings.NewReader(<code>{"name": "golang"}</code>)
req, _ := http.NewRequest("POST", "<a href="https://www.php.cn/link/dc076eb055ef5f8a60a41b6195e9f329">https://www.php.cn/link/dc076eb055ef5f8a60a41b6195e9f329</a>", data)
req.Header.Set("Content-Type", "application/json")
req.Header.Set("User-Agent", "my-app/1.0")</p><p>resp, err := client.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()</p><p>body, _ := io.ReadAll(resp.Body)
fmt.Println(string(body))</p>

通过 http.NewRequest 创建请求,可灵活设置方法、Body和Header。使用自定义 Client 还能控制超时、重定向策略等。

3. 发送表单数据(application/x-www-form-urlencoded)

向服务端提交表单时,常需编码为 form 格式。

form := url.Values{}
form.Add("username", "admin")
form.Add("password", "123456")
<p>req, _ := http.NewRequest("POST", "<a href="https://www.php.cn/link/dc076eb055ef5f8a60a41b6195e9f329">https://www.php.cn/link/dc076eb055ef5f8a60a41b6195e9f329</a>", 
strings.NewReader(form.Encode()))
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")</p><p>resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()</p>

url.Values 提供了便捷的 form 编码功能,配合正确的 Content-Type 即可模拟登录等操作。

4. 添加请求头、Cookie与认证信息

很多API需要身份验证或特定Header。可以在 Request 对象上直接设置。

req, _ := http.NewRequest("GET", "https://api.example.com/user", nil)
req.Header.Set("Authorization", "Bearer your-token-here")
req.Header.Set("Accept", "application/json")
<p>// 添加Cookie
req.AddCookie(&http.Cookie{
Name:  "session_id",
Value: "abc123",
})</p><p>resp, _ := http.DefaultClient.Do(req)</p>
                    <div class="aritcle_card">
                        <a class="aritcle_card_img" href="/ai/1624">
                            <img src="https://img.php.cn/upload/ai_manual/000/969/633/68b6d995a3e16812.png" alt="NameGPT">
                        </a>
                        <div class="aritcle_card_info">
                            <a href="/ai/1624">NameGPT</a>
                            <p>免费的名称生成器,AI驱动在线生成企业名称及Logo</p>
                            <div class="">
                                <img src="/static/images/card_xiazai.png" alt="NameGPT">
                                <span>119</span>
                            </div>
                        </div>
                        <a href="/ai/1624" class="aritcle_card_btn">
                            <span>查看详情</span>
                            <img src="/static/images/cardxiayige-3.png" alt="NameGPT">
                        </a>
                    </div>
                

Header 设置遵循键值对规则,Cookie 使用 AddCookie 方法添加,多个Cookie可多次调用。

5. 处理重定向与禁用自动跳转

默认情况下,Client 会自动跟随3xx重定向。如需手动控制,可自定义 Client 的 CheckRedirect 函数。

client := &http.Client{
    CheckRedirect: func(req *http.Request, via []*http.Request) error {
        return http.ErrUseLastResponse // 禁止重定向,返回最后一次请求
    },
}

这在调试或需要读取重定向响应头时非常有用。

6. 超时控制的最佳实践

生产环境中必须设置超时,避免请求长时间挂起。

client := &http.Client{
    Timeout: 5 * time.Second, // 整个请求的总超时
}

也可以更细粒度地控制连接、读写超时,使用 http.Transport 配合 DialContext 实现。

7. 错误处理注意事项

HTTP请求可能因网络、DNS、超时、TLS等问题失败,也可能返回非200状态码。注意区分:

  • err != nil 表示请求未完成(如无法连接)
  • resp.StatusCode >= 400 属于业务层面错误,仍需读取Body
resp, err := http.Get("https://httpbin.org/status/500")
if err != nil {
    log.Fatal(err) // 网络层错误
}
// 即使返回500,err仍为nil,需单独判断状态码
if resp.StatusCode != http.StatusOK {
    fmt.Printf("server returned %d\n", resp.StatusCode)
}

基本上就这些。掌握 net/http 的基本用法后,你可以轻松实现各类HTTP交互。不复杂但容易忽略的是资源释放和超时控制,务必在实际项目中加以重视。

以上就是Golang如何使用net/http发送HTTP请求_Golang net/http HTTP请求实践详解的详细内容,更多请关注其它相关文章!


# 如何实现  # seo相关网站有哪些  # 平舆网站优化多少钱  # 佛山北滘网站建设  # 广西网站建设方案及报价  # 兖州区网站推广效果  # 114企业网站推广  # 济南关键词排名费用  # 宁波建设银行网站首页  # 嘉兴正规网站seo优化报价  # 漫画网站如何设计推广  # 如何在  # 多个  # 你可以  # 的是  # 复用  # golang  # 表单  # 自定义  # 重定向  # 如何使用  # session  # 工具  # app  # 编码  # go语言  # cookie  # go  # json  # js  # word  # http请求 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: python3时间如何用calendar输出?  J*aScript 字符串标签转换:使用正则表达式高效替换  MAC的“快捷指令”怎么同步到iPhone_MAC利用iCloud同步所有设备的自动化指令  Win10怎么设置静态IP地址 Win10手动配置IP地址步骤【指南】  深入理解Go语言中Map值与方法接收器的交互:为什么需要临时变量  c++ 命名空间怎么用 c++ namespace使用指南  高德地图公交到站提醒失败如何解决 高德提醒权限设置  印象笔记怎样用批量导出备知识库_印象笔记用批量导出备知识库【备份方法】  在J*a中如何使用Exception包装底层异常_异常包装与信息传递方法说明  优化MinIO list_objects_v2 操作的性能瓶颈与最佳实践  CSS自定义字体样式被系统字体替换怎么办_font-face方式指定font-display控制渲染策略  uc浏览器网页版入口 uc浏览器网页版最新网址  C++如何打印当前代码行号与文件名_C++预定义宏FILE与LINE的使用  qq游戏免费畅玩入口_qq游戏电脑版快速启动  React/Next.js中实现列表项的动态选择与移动  c++中的std::basic_string的SSO优化_c++短字符串优化深度解析  Angular Material 垂直步进器:实现底部到顶部排序的教程  Sublime Text怎么设置垂直标尺_Sublime配置Rulers规范代码长度  Golang如何使用bytes.Split分割字节切片_Golang bytes切片分割方法  在Go Martini框架中高效服务动态生成图像的实践指南  在J*a中如何捕获IndexOutOfBoundsException_索引越界异常防护方法说明  如何在低配置电脑上搭建轻量级J*a环境_占用更小的环境选择技巧  快速CSGO开箱网站指南 CSGO开箱平台推荐  J*aScript生成器_j*ascript异步迭代  海棠账号登录入口_登录海棠账户同步阅读记录  抖音网页版企业服务中心登录入口_抖音网页版企业登录平台  微信网页版官方入口直达 微信网页版网页版登录使用方法  c++20的std::jthread是什么_c++可中断线程与RAII式管理  企业名称高精度匹配:N-gram方法在结构相似性分析中的应用  12306怎么选座位选到安静区_12306选座安静区域选择策略  漫蛙2网页版漫画入口 漫蛙漫画在线官方登录  LINUX怎么设置定时任务_LINUX crontab配置教程  微博网页版官方账号登录 微博网页版内容浏览使用指南  初次安装JDK时环境变量如何正确配置_J*A_HOME与PATH设置规则讲解  豆包手机助手发布技术预览版:直接嵌入手机系统!努比亚样机发售  C++如何连接MySQL数据库_C++使用Connector/C++操作MySQL数据库教程  Django表单验证失败时保留用户输入数据的最佳实践  CSS布局:解决全屏元素100%尺寸与外边距导致的页面溢出问题  Win11怎么合并任务栏图标 Win11开启任务栏合并减少图标占空间【方法】  苹果手机如何防止被恶意App追踪  QQ邮箱登录首页官网地址2026 QQ邮箱官方网页入口  composer的"require-dev"部分是用来做什么的?  Lar*el用户头像管理:实现图片缩放、存储与旧文件安全删除的最佳实践  Win10双系统截图高效法 截屏快捷键速记【技巧】  解决Tabulator日期时间排序问题的专业指南  AO3访问入口汇总 AO3网页版同人作品一键直达  谷歌浏览器最新官方入口链接 谷歌浏览器网页版官网导航  Flexbox布局实践:实现粘性导航栏与底部固定页脚  Python:递归比较文件夹内容并找出特定类型文件的差异  Log4j Console Appender性能瓶颈与高并发优化策略 

搜索