实现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进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。