在 Go 中使用 Watch-IP
github.com/Digitload/watch-ip-sdk-go(v0.1.1)封装了 GET /v1/geo,支持基于 context 的请求,除标准库外没有任何依赖。
安装
需要 Go 1.21 及以上版本。该模块从 Watch-IP 主仓库只读镜像到一个公开仓库,以便 go get 能够获取它。
go get
go get github.com/Digitload/watch-ip-sdk-go快速开始
GetGeo 的第一个参数是 context.Context——相当于 JS SDK 中的 AbortSignal。与其他服务器端 SDK 一样,从服务器(而非浏览器)调用时,请设置 WithOrigin 以满足该密钥的允许来源校验。由于 Watch-IP 的每个字段都可能独立为 null,因此每个位置字段都是指针类型——在解引用之前请先检查是否为 nil。
Go
client, err := watchip.New("wip_pub_xxxxxxxx", watchip.WithOrigin("https://example.com"))
if err != nil {
log.Fatal(err)
}
geo, err := client.GetGeo(context.Background())
if err != nil {
log.Fatal(err)
}
if geo.Country != nil && geo.City != nil {
fmt.Println(*geo.Country, *geo.City)
} else {
fmt.Println("此连接无法确定位置")
}错误处理与超时
每一次失败都会返回一个带有 Status 与 Code 字段的 *WatchIPError。请使用 context.WithTimeout 来限定请求时间,而不是使用客户端级别的超时选项。
Go
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
geo, err := client.GetGeo(ctx)
var wipErr *watchip.WatchIPError
if errors.As(err, &wipErr) {
fmt.Println(wipErr.Code, wipErr.Status, wipErr.Message)
}本 SDK 不涵盖的内容
该模块只调用 GET /v1/geo。IP 查询、邮箱验证与风险检测是另外的服务器到服务器端点,目前尚无 Go 客户端——请直接使用 net/http 调用它们,身份验证方式与身份验证指南中所述一致。