Go语言标准库的net/http
不仅支持构建HTTP服务端程序,也提供了构建HTTP客户端的功能,这篇笔记我们简单介绍如何使用Go语言标准库实现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))
}
net/http
提供了http.Get()
、http.Post()
等方法用于创建HTTP请求,我们代码中直接使用了http.Get()
发起GET请求,对于其它的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个参数是请求体。