Skip to content

🧭 Client 客户端

Client 是整个 SDK 的核心,所有查询都通过它发起。

它是什么

Client 是一个线程安全的 HTTP 客户端封装,持有调用 ipapi.co 所需的全部状态:

go
type Client struct {
	HTTPClient   *http.Client          // 底层 HTTP 客户端
	BaseURL      string                // API 基地址,默认 https://ipapi.co/
	APIKey       string                // API 密钥
	APIKeyMode   APIKeyMode            // 认证方式(Header / Query)
	UserAgent    string                // User-Agent 头
	Retries      int                   // 重试次数,默认 2
	RateLimiter  <-chan time.Time      // 速率限制通道
	Callback     string                // JSONP 回调名
	errorHandler func(error) error     // 自定义错误处理
}

🎨 一图抵千言

下面这张类图展示了 Client 各字段、WithXxx 函数式选项与内部辅助方法之间的装配关系——选项负责写字段,方法负责读字段。

🧩 依赖视角

上面那张图看的是「谁写字段」;下面这张看的是运行时 Client 依赖哪些协作者、各自承担什么职责。http.Client 负责网络传输,RateLimiter 通道负责节流,errorHandler 回调负责错误改写——三者皆可替换,这正是函数式选项的意义。

线程安全

Client 内部无共享可变状态(请求都新建 *http.Request),可以安全地在多个 goroutine 间复用:

go
var client = ipapi.NewClient()

func handler(w http.ResponseWriter, r *http.Request) {
	// 多个请求并发调用,安全
	info, _ := client.GetClientIPInfo(r.Context(), "json")
	// ...
}

🚀 性能建议

复用同一个 Client 实例,不要每次请求都 NewClient()。复用能复用底层连接池,减少 TCP/TLS 握手开销。

默认值

字段默认值来源
BaseURLhttps://ipapi.co/defaultBaseURL
HTTPClient.Timeout10sdefaultTimeout
UserAgentipapi-go-client/1.0硬编码
Retries2硬编码
APIKeyModeAPIKeyHeaderiota 零值
CheckRedirect最多 3 次跳转maxRedirects

六个查询方法

Client 暴露 6 个方法,构成「指定IP / 客户端IP × 完整/单字段 × 解析/raw」的矩阵:

方法目标返回文档
GetIPInfo指定 IP*IPInfo
GetIPInfoRaw指定 IP[]byte
GetField指定 IP 单字段string
GetClientIPInfo客户端 IP*IPInfo
GetClientIPInfoRaw客户端 IP[]byte
GetClientField客户端 IP 单字段string

配置项一览

选项作用文档
WithAPIKey设置 API Key
WithAPIKeyQuery改用 query 参数认证
WithCustomHTTPClient替换底层 *http.Client
WithErrorHandler注入错误处理回调
WithCallback设置 JSONP 回调名

何时该自定义

场景推荐配置
本地开发/小流量NewClient() 默认即可
生产服务WithAPIKey + WithCustomHTTPClient(更长超时)
高并发RateLimiter 通道 + 复用 Client
跨域前端(JSONP)WithCallback
审计/监控WithErrorHandler 做日志/metrics
受限网络WithCustomHTTPClient 注入代理

下一步

基于 MIT 许可证发布