首页 > 后端开发 > Golang > 正文

如何用 Golang 开发一个 IP 查询工具_Golang 网络请求与 JSON 数据解析

P粉602998670
发布: 2025-11-17 01:29:07
原创
217人浏览过
答案:开发IP查询工具可掌握Golang网络请求与JSON解析。通过调用如ip.sb或ipapi.co等API,使用net/http发送GET请求获取IP信息,结合encoding/json包将响应数据解析为结构体,实现地理位置查询,并建议设置超时与状态码检查以增强错误处理。

如何用 golang 开发一个 ip 查询工具_golang 网络请求与 json 数据解析

开发一个 IP 查询工具是学习 Golang 网络请求和 JSON 数据解析的绝佳实践。通过调用公开的 IP 地址信息 API,我们可以获取当前或指定 IP 的地理位置、运营商等信息。整个过程涉及 HTTP 请求发送、JSON 响应解析以及结构体定义,适合初学者掌握 net/http 和 encoding/json 包的基本用法。

选择合适的 IP 查询 API

要查询 IP 信息,首先需要一个可靠的公共接口。常用的免费 API 包括:

  • ip.sb:返回简洁的 JSON 数据,适合快速测试
  • ipapi.co:提供详细的地理信息
  • httpbin.org/ip:主要用于测试公网出口 IP

ip.sb 为例,访问 https://www.php.cn/link/f62cc9a5c2e8242b15ec3cd88f4e4afe 可直接返回当前客户端的公网 IP 地址。

发送 HTTP 请求获取 IP 信息

使用 Golang 的 net/http 包可以轻松发起 GET 请求。以下代码演示如何获取本机公网 IP:

立即学习go语言免费学习笔记(深入)”;

package main
<p>import (
"fmt"
"io"
"net/http"
)</p><p>func getPublicIP() (string, error) {
resp, err := http.Get("<a href="https://www.php.cn/link/f62cc9a5c2e8242b15ec3cd88f4e4afe">https://www.php.cn/link/f62cc9a5c2e8242b15ec3cd88f4e4afe</a>")
if err != nil {
return "", err
}
defer resp.Body.Close()</p><pre class='brush:php;toolbar:false;'>body, err := io.ReadAll(resp.Body)
if err != nil {
    return "", err
}

return string(body), nil
登录后复制

}

func main() { ip, err := getPublicIP() if err != nil { fmt.Println("请求失败:", err) return } fmt.Println("当前公网 IP:", ip) }

定义结构体并解析 JSON 响应

如果 API 返回的是完整对象(如位置、时区等),我们需要定义结构体来映射 JSON 字段。以 ipapi.co 为例,它返回如下格式:

{"ip":"8.8.8.8","country":"United States","region":"California","city":"Mountain View"}

对应的 Go 结构体应为:

Find JSON Path Online
Find JSON Path Online

Easily find JSON paths within JSON objects using our intuitive Json Path Finder

Find JSON Path Online 30
查看详情 Find JSON Path Online
type IPLocation struct {
    IP      string `json:"ip"`
    Country string `json:"country"`
    Region  string `json:"region"`
    City    string `json:"city"`
}
登录后复制

使用 encoding/json 包进行反序列化:

func queryIPLocation(ipAddr string) (*IPLocation, error) {
    url := fmt.Sprintf("https://ipapi.co/%s/json/", ipAddr)
    resp, err := http.Get(url)
    if err != nil {
        return nil, err
    }
    defer resp.Body.Close()
<pre class='brush:php;toolbar:false;'>if resp.StatusCode != 200 {
    return nil, fmt.Errorf("API 错误: %d", resp.StatusCode)
}

var result IPLocation
err = json.NewDecoder(resp.Body).Decode(&result)
if err != nil {
    return nil, err
}

return &result, nil
登录后复制

}

在 main 函数中调用并打印结果:

func main() {
    location, err := queryIPLocation("8.8.8.8")
    if err != nil {
        fmt.Println("查询失败:", err)
        return
    }
    fmt.Printf("IP: %s\n国家: %s\n地区: %s\n城市: %s\n",
        location.IP, location.Country, location.Region, location.City)
}
登录后复制

错误处理与超时设置

实际项目中需增强健壮性。建议自定义 HTTP 客户端并设置超时:

client := &http.Client{
    Timeout: 10 * time.Second,
}
resp, err := client.Get("https://ipapi.co/8.8.8.8/json/")
登录后复制

同时检查响应状态码,避免对错误页面进行 JSON 解析。

基本上就这些。通过这个小工具,你掌握了 Golang 发起网络请求、解析 JSON 数据、结构体标签使用以及基础错误处理的核心技能。后续可扩展支持命令行参数输入 IP、缓存机制或输出格式(如 CSV、表格)等功能。不复杂但容易忽略细节,比如关闭响应体和处理网络异常。

以上就是如何用 Golang 开发一个 IP 查询工具_Golang 网络请求与 JSON 数据解析的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号