基于Go語(yǔ)言開發(fā)一個(gè) IP 歸屬地查詢接口工具
在日常開發(fā)中,IP 地址歸屬地查詢是一個(gè)常見需求:比如記錄用戶訪問(wèn)日志時(shí)展示用戶的地理位置,或在安全防護(hù)系統(tǒng)中分析異常登錄來(lái)源。本文將帶你用 Go 語(yǔ)言快速開發(fā)一個(gè) IP 歸屬地查詢接口服務(wù)。
功能目標(biāo)
提供一個(gè) HTTP 接口,輸入 IP 地址返回歸屬地信息
支持查詢單個(gè) IP,也可擴(kuò)展成批量查詢
數(shù)據(jù)源可選擇:
- 本地離線 IP 數(shù)據(jù)庫(kù)(如 ip2region)
- 第三方 API(如 ip-api、ipinfo 等)
結(jié)果返回 JSON 格式
技術(shù)棧
Go 標(biāo)準(zhǔn)庫(kù):net/http、encoding/json
第三方庫(kù):
github.com/lionsoul2014/ip2region/binding/golang/xdb —— 離線 IP 數(shù)據(jù)庫(kù)解析
存儲(chǔ)方式:使用本地 ip2region.xdb 文件
項(xiàng)目結(jié)構(gòu)
ip-lookup/
├── main.go
├── ip2region.xdb # 離線數(shù)據(jù)庫(kù)文件
├── go.mod
核心代碼(main.go)
package main
import (
"encoding/json"
"log"
"net"
"net/http"
"github.com/lionsoul2014/ip2region/binding/golang/xdb"
)
// 響應(yīng)結(jié)構(gòu)
type IPInfo struct {
IP string `json:"ip"`
Region string `json:"region"`
Error string `json:"error,omitempty"`
}
var searcher *xdb.Searcher
func main() {
// 加載 ip2region 數(shù)據(jù)庫(kù)
var err error
searcher, err = xdb.NewWithFileOnly("ip2region.xdb")
if err != nil {
log.Fatalf("? 加載 ip2region.xdb 失敗: %v", err)
}
http.HandleFunc("/ip", queryIP)
log.Println("? IP 歸屬地查詢服務(wù)已啟動(dòng): http://localhost:8080/ip?addr=1.1.1.1")
http.ListenAndServe(":8080", nil)
}
func queryIP(w http.ResponseWriter, r *http.Request) {
addr := r.URL.Query().Get("addr")
if addr == "" {
writeJSON(w, IPInfo{Error: "缺少參數(shù) addr"})
return
}
if net.ParseIP(addr) == nil {
writeJSON(w, IPInfo{IP: addr, Error: "無(wú)效的 IP 地址"})
return
}
region, err := searcher.SearchByStr(addr)
if err != nil {
writeJSON(w, IPInfo{IP: addr, Error: err.Error()})
return
}
writeJSON(w, IPInfo{IP: addr, Region: region})
}
func writeJSON(w http.ResponseWriter, data IPInfo) {
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(data)
}
使用方法
1.初始化項(xiàng)目并安裝依賴
go mod init ip-lookup go get github.com/lionsoul2014/ip2region/binding/golang/xdb
2.下載 ip2region.xdb 數(shù)據(jù)庫(kù)文件,放到項(xiàng)目根目錄
3.運(yùn)行
go run main.go
4.請(qǐng)求示例
curl "http://localhost:8080/ip?addr=8.8.8.8"
返回結(jié)果示例:
{
"ip": "8.8.8.8",
"region": "美國(guó)|0|加利福尼亞|圣克拉拉|谷歌"
}
擴(kuò)展功能
- 批量查詢:支持上傳 IP 列表文件,返回批量結(jié)果
- 緩存機(jī)制:對(duì)高頻 IP 查詢做緩存,提升性能
- 前端展示:結(jié)合簡(jiǎn)單前端頁(yè)面展示查詢結(jié)果
- 多數(shù)據(jù)源支持:同時(shí)支持 ip2region 和第三方 API,作為備份
總結(jié)
通過(guò)本案例,我們實(shí)現(xiàn)了一個(gè) IP 歸屬地查詢接口,使用 ip2region 離線庫(kù)做到快速查詢,性能高效且無(wú)需依賴外部服務(wù)。這個(gè)小工具既能單獨(dú)運(yùn)行,也能嵌入到日志分析、Web 服務(wù)或安全監(jiān)控系統(tǒng)中使用,是 Go 項(xiàng)目開發(fā)中的一個(gè)實(shí)用模塊。
到此這篇關(guān)于基于Go語(yǔ)言開發(fā)一個(gè) IP 歸屬地查詢接口工具的文章就介紹到這了,更多相關(guān)Go查詢IP歸屬地內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang干貨分享之利用AST實(shí)現(xiàn)AOP功能
本文主要是一個(gè)純干貨分享,主要介紹了Golang如何利用AST實(shí)現(xiàn)AOP功能,文中的示例代碼簡(jiǎn)潔易懂,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-04-04
golang調(diào)用windows平臺(tái)的dll庫(kù)的方法實(shí)現(xiàn)
本文主要介紹了golang調(diào)用windows平臺(tái)的dll庫(kù)的方法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-03-03
基于Go語(yǔ)言搭建靜態(tài)文件服務(wù)器的詳細(xì)教程
Go 是一個(gè)開源的編程語(yǔ)言,它能讓構(gòu)造簡(jiǎn)單、可靠且高效的軟件變得容易,本文給大家介紹了基于Go語(yǔ)言搭建靜態(tài)文件服務(wù)器的詳細(xì)教程,文中通過(guò)圖文和代碼講解的非常詳細(xì),需要的朋友可以參考下2024-10-10
golang實(shí)現(xiàn)對(duì)JavaScript代碼混淆
在Go語(yǔ)言中,你可以使用一些工具來(lái)混淆JavaScript代碼,一個(gè)常用的工具是Terser,它可以用于壓縮和混淆JavaScript代碼,你可以通過(guò)Go語(yǔ)言的`os/exec`包來(lái)調(diào)用Terser工具,本文給通過(guò)一個(gè)簡(jiǎn)單的示例給大家介紹一下,感興趣的朋友可以參考下2024-01-01
在Go語(yǔ)言項(xiàng)目中使用Zap日志庫(kù)的操作過(guò)程
本文將先介紹Go語(yǔ)言原生的日志庫(kù)的使用,然后詳細(xì)介紹非常流行的Uber開源的zap日志庫(kù),同時(shí)會(huì)介紹如何搭配·Lumberjack·實(shí)現(xiàn)日志的切割和歸檔,對(duì)Go使用Zap日志庫(kù)相關(guān)知識(shí)感興趣的朋友一起看看吧2024-03-03
go使用snmp庫(kù)查詢mib數(shù)據(jù)案例代碼
go語(yǔ)言使用snmp庫(kù)中的 k-sone/snmpgo 實(shí)現(xiàn)相關(guān)mib查詢,本文通過(guò)實(shí)例代碼給大家介紹了go使用snmp庫(kù)查詢mib數(shù)據(jù),感興趣的朋友跟隨小編一起看看吧2023-10-10

