实现HTTP客户端
Go语言标准库的net/http不仅支持构建HTTP服务端程序,也提供了构建HTTP客户端的功能,这篇笔记我们简单介绍如何使用Go语言标准库实现HTTP客户端。
发起HTTP请求
下面例子代码我们发起GET请求,并读取和打印响应体。
package main
import (
"io"
"log/slog"
"net/http"
)
func main() {
// 发起GET请求
response, err := http.Get("http://localhost:8080/api/v1/students")
if err != nil {
slog.Error(err.Error())
return
}
defer func(Body io.ReadCloser) {
err := Body.Close()
if err != nil {
slog.Error(err.Error())
return
}
}(response.Body)
// 读取响应体中所有数据
body, err := io.ReadAll(response.Body)
if err != nil {
slog.Error(err.Error())
return
}
// 打印响应信息
slog.Info(response.Status)
slog.Info(string(body))
}
Go标准库net/http提供了几个常用的顶层快捷函数,包括http.Get()、http.Post()、http.PostForm()和http.Head(),它们用于快速发起对应HTTP方法的请求,上面代码就直接使用了http.Get()发起GET请求。不过需要注意的是,标准库并没有为所有HTTP方法都提供快捷函数,例如PUT、DELETE、PATCH就没有对应的快捷函数;如果要发送PUT、DELETE、PATCH方法请求,通常需要使用http.NewRequest()创建*http.Request,再通过http.Client.Do()发送。
自定义HTTP客户端配置
在某些情况下,我们可能需要更高级的控制,比如设置超时、添加请求头信息等,这时我们可以创建一个自定义的HTTP客户端,下面是一个例子。
package main
import (
"io"
"log/slog"
"net/http"
"time"
)
func main() {
// 创建自定义的HTTP客户端
client := &http.Client{
Timeout: 10 * time.Second, // 设置超时时间
}
// 创建GET请求
request, err := http.NewRequest("GET", "http://localhost:8080/api/v1/students", nil)
if err != nil {
slog.Error(err.Error())
return
}
request.Header.Set("Accept", "application/json")
// 发起请求
response, err := client.Do(request)
if err != nil {
slog.Error(err.Error())
return
}
defer func(Body io.ReadCloser) {
err := Body.Close()
if err != nil {
slog.Error(err.Error())
return
}
}(response.Body)
// 读取响应体中所有数据
body, err := io.ReadAll(response.Body)
if err != nil {
slog.Error(err.Error())
return
}
// 打印响应信息
slog.Info(response.Status)
slog.Info(string(body))
}
代码中http.NewRequest()可以创建不同的HTTP方法对应的请求,它的第1个参数是请求方法,第2个参数是请求URL,第3个参数是请求体。
作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。