实现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))
}

net/http提供了http.Get()http.Post()等方法用于创建HTTP请求,我们代码中直接使用了http.Get()发起GET请求,对于其它的HTTP方法也有对应的封装函数。

自定义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进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。
Copyright © 2017-2024 Gacfox All Rights Reserved.
Build with NextJS | Sitemap