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]))
}