常见问题
什么时候用包级函数,什么时候创建客户端?
包级函数适合简单场景:一次性请求、脚本、工具。
go
result, _ := httpc.Get("https://api.example.com/data")创建客户端适合需要自定义配置、复用连接池、使用中间件的场景。
go
client, _ := httpc.New(httpc.PerformanceConfig())
defer client.Close()如何选择配置预设?
| 预设 | 适用场景 |
|---|---|
DefaultConfig() | 通用场景,安全默认值 |
SecureConfig() | 处理用户提供的 URL、金融/医疗场景 |
PerformanceConfig() | 内部微服务通信、高并发 API |
TestingConfig() | 单元测试、本地开发 |
MinimalConfig() | 一次性脚本、简单 HTTP 调用 |
如何访问内部服务?
默认 SSRF 防护阻止私有 IP 连接。如需访问内部服务:
go
cfg := httpc.DefaultConfig()
cfg.Security.AllowPrivateIPs = true // ⚠️ 完全禁用所有连接级 SSRF 拨号校验(非仅私有 IP);生产环境宜用 SSRFExemptCIDRs 精确豁免
// 或精确豁免
cfg.Security.SSRFExemptCIDRs = []string{"10.0.0.0/8"}如何设置代理?
go
cfg := httpc.DefaultConfig()
cfg.Connection.ProxyURL = "http://proxy:8080"
client, _ := httpc.New(cfg)
// 使用系统代理
cfg.Connection.EnableSystemProxy = true如何处理 HTTP 错误码?
HTTPC 不会将 4xx/5xx 视为 error,需要手动检查:
go
result, err := client.Get(url)
if err != nil {
// 网络层错误
return err
}
switch {
case result.IsSuccess():
// 2xx 成功
case result.IsClientError():
// 4xx 客户端错误
log.Printf("请求参数错误:%d", result.StatusCode())
case result.IsServerError():
// 5xx 服务端错误
log.Printf("服务端故障:%d", result.StatusCode())
}如何禁用重试?
go
// 全局禁用
cfg := httpc.DefaultConfig()
cfg.Retry.MaxRetries = 0
// 或使用 MinimalConfig
client, _ := httpc.New(httpc.MinimalConfig())
// 单个请求禁用
result, _ := client.Get(url, httpc.WithMaxRetries(0))如何设置请求超时?
四种方式,优先级从高到低:
go
// 1. 上下文超时(推荐)
ctx, cancel := context.WithTimeout(ctx, 5*time.Second)
result, _ := client.Request(ctx, "GET", url)
// 2. 请求选项
result, _ := client.Get(url, httpc.WithTimeout(5*time.Second))
// 3. 中间件强制超时
middleware := httpc.TimeoutMiddleware(5 * time.Second)
// 4. 客户端默认超时
cfg.Timeouts.Request = 30 * time.Second如何记录请求日志?
go
cfg := httpc.DefaultConfig()
cfg.Middleware.Middlewares = []httpc.MiddlewareFunc{
httpc.LoggingMiddleware(func(format string, args ...any) {
log.Printf("[HTTP] "+format, args...)
}),
}
client, _ := httpc.New(cfg)TestingConfig 为什么会打印警告?
TestingConfig 禁用了安全特性(TLS 验证、SSRF 防护),在非测试环境使用存在安全风险。检测到非测试环境时会打印警告。
仅用于 *_test.go 文件或本地开发。
如何启用 DNS-over-HTTPS?
DoH 可以减少 DNS 解析延迟并防止 DNS 劫持:
go
cfg := httpc.DefaultConfig()
cfg.Connection.EnableDoH = true
cfg.Connection.DoHCacheTTL = 5 * time.Minute默认使用 Cloudflare、Google、AliDNS 三个提供商(按优先级回退)。如果所有 DoH 提供商不可用,会自动回退到系统 DNS。
TIP
DoH 适用于对 DNS 解析安全性有要求的场景。常规 API 调用无需开启,默认 DNS 即可满足需求。