Skip to content

Fetch - HTTP 客户端

Fetch 是一个轻量级、高性能的 HTTP 客户端,灵感来自 Fetch API、Axios 和 Got。

特性

  • 🚀 轻量级和快速
  • 🔒 类型安全
  • 🌐 丰富的功能(HTTP/2、TLS、认证、代理等)
  • 📦 易于使用
  • 🛡️ 生产就绪(超时、重试、进度跟踪、错误处理)
  • ⚡ 强大(流式传输、Context 取消、自定义头部等)

安装

bash
go get github.com/go-zoox/fetch

快速开始

基本 GET 请求

go
package main

import (
    "fmt"
    "github.com/go-zoox/fetch"
)

func main() {
    res, err := fetch.Get("https://api.example.com/users")
    if err != nil {
        panic(err)
    }
    
    fmt.Println("Status:", res.Status)
    fmt.Println("Body:", res.String())
}

POST 请求

go
res, err := fetch.Post("https://api.example.com/users", &fetch.Config{
    Body: map[string]interface{}{
        "name":  "Alice",
        "email": "alice@example.com",
    },
})
if err != nil {
    panic(err)
}

fmt.Println(res.String())

链式调用

go
res, err := fetch.New().
    SetURL("https://api.example.com/users").
    SetMethod("POST").
    SetBody(map[string]interface{}{
        "name": "Alice",
    }).
    SetHeader("Content-Type", "application/json").
    SetHeader("Authorization", "Bearer token").
    Execute()

设置超时

go
res, err := fetch.Get("https://api.example.com/users", &fetch.Config{
    Timeout: 5 * time.Second,
})

设置重试

go
res, err := fetch.Get("https://api.example.com/users", &fetch.Config{
    Retry: &fetch.RetryConfig{
        MaxAttempts: 3,
        Delay:       1 * time.Second,
    },
})

文件上传

go
file, _ := os.Open("file.txt")
defer file.Close()

res, err := fetch.Post("https://api.example.com/upload", &fetch.Config{
    Body: fetch.File(file, "file.txt"),
})

下载文件

go
res, err := fetch.Get("https://example.com/file.zip")
if err != nil {
    panic(err)
}

os.WriteFile("file.zip", res.Bytes(), 0644)

使用 Context

go
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

res, err := fetch.Get("https://api.example.com/users", &fetch.Config{
    Context: ctx,
})

高级用法

自定义 HTTP 客户端

go
client := &http.Client{
    Timeout: 10 * time.Second,
}

res, err := fetch.Get("https://api.example.com/users", &fetch.Config{
    HTTPClient: client,
})

进度跟踪

go
res, err := fetch.Get("https://example.com/large-file.zip", &fetch.Config{
    OnProgress: func(progress *fetch.Progress) {
        fmt.Printf("Progress: %.2f%%\n", progress.Percent)
    },
})

流式响应

go
res, err := fetch.Get("https://example.com/stream")
if err != nil {
    panic(err)
}

reader := res.Stream()
defer reader.Close()

// 读取流数据
buffer := make([]byte, 1024)
for {
    n, err := reader.Read(buffer)
    if err == io.EOF {
        break
    }
    // 处理数据
    fmt.Print(string(buffer[:n]))
}

更多信息

基于 VitePress 构建