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

在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()body, _ := io.ReadAll(resp.Body)fmt.Println(string(body))
注意:一定要调用 resp.Body.Close() 避免资源泄露。返回的 resp 是 *http.Response 类型,包含状态码、Header 和 Body 等信息。
2. 使用Client自定义请求(支持POST、PUT等)
对于更复杂的请求,比如POST、PUT或需要设置超时、Header等,应使用 http.Client 并手动创建 http.Request。
立即学习“go语言免费学习笔记(深入)”;
client := &http.Client{Timeout: 10 * time.Second}data := strings.NewReader({"name": "golang"})req, _ := http.NewRequest("POST", "https://www.php.cn/link/dc076eb055ef5f8a60a41b6195e9f329", data)req.Header.Set("Content-Type", "application/json")req.Header.Set("User-Agent", "my-app/1.0")
resp, err := client.Do(req)if err != nil {log.Fatal(err)}defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)fmt.Println(string(body))
通过 http.NewRequest 创建请求,可灵活设置方法、Body和Header。使用自定义 Client 还能控制超时、重定向策略等。
3. 发送表单数据(application/x-www-form-urlencoded)
向服务端提交表单时,常需编码为 form 格式。
form := url.Values{}form.Add("username", "admin")form.Add("password", "123456")req, _ := http.NewRequest("POST", "https://www.php.cn/link/dc076eb055ef5f8a60a41b6195e9f329", strings.NewReader(form.Encode()))req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
resp, _ := http.DefaultClient.Do(req)defer resp.Body.Close()
url.Values 提供了便捷的 form 编码功能,配合正确的 Content-Type 即可模拟登录等操作。
4. 添加请求头、Cookie与认证信息
很多API需要身份验证或特定Header。可以在 Request 对象上直接设置。
Waymark
Waymark是一个视频制作工具,帮助企业快速轻松地制作高影响力的广告。
79 查看详情
req, _ := http.NewRequest("GET", "https://api.example.com/user", nil)req.Header.Set("Authorization", "Bearer your-token-here")req.Header.Set("Accept", "application/json")// 添加Cookiereq.AddCookie(&http.Cookie{Name: "session_id",Value: "abc123",})
resp, _ := http.DefaultClient.Do(req)
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请求实践详解的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1051023.html
微信扫一扫
支付宝扫一扫