基于Go語言開發(fā)一個 IP 歸屬地查詢接口工具
在日常開發(fā)中,IP 地址歸屬地查詢是一個常見需求:比如記錄用戶訪問日志時展示用戶的地理位置,或在安全防護系統(tǒng)中分析異常登錄來源。本文將帶你用 Go 語言快速開發(fā)一個 IP 歸屬地查詢接口服務(wù)。
功能目標(biāo)
提供一個 HTTP 接口,輸入 IP 地址返回歸屬地信息
支持查詢單個 IP,也可擴展成批量查詢
數(shù)據(jù)源可選擇:
- 本地離線 IP 數(shù)據(jù)庫(如 ip2region)
- 第三方 API(如 ip-api、ipinfo 等)
結(jié)果返回 JSON 格式
技術(shù)棧
Go 標(biāo)準(zhǔn)庫:net/http、encoding/json
第三方庫:
github.com/lionsoul2014/ip2region/binding/golang/xdb —— 離線 IP 數(shù)據(jù)庫解析
存儲方式:使用本地 ip2region.xdb 文件
項目結(jié)構(gòu)
ip-lookup/
├── main.go
├── ip2region.xdb # 離線數(shù)據(jù)庫文件
├── 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ù)庫
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ù)已啟動: 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: "無效的 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.初始化項目并安裝依賴
go mod init ip-lookup go get github.com/lionsoul2014/ip2region/binding/golang/xdb
2.下載 ip2region.xdb 數(shù)據(jù)庫文件,放到項目根目錄
3.運行
go run main.go
4.請求示例
curl "http://localhost:8080/ip?addr=8.8.8.8"
返回結(jié)果示例:
{
"ip": "8.8.8.8",
"region": "美國|0|加利福尼亞|圣克拉拉|谷歌"
}
擴展功能
- 批量查詢:支持上傳 IP 列表文件,返回批量結(jié)果
- 緩存機制:對高頻 IP 查詢做緩存,提升性能
- 前端展示:結(jié)合簡單前端頁面展示查詢結(jié)果
- 多數(shù)據(jù)源支持:同時支持 ip2region 和第三方 API,作為備份
總結(jié)
通過本案例,我們實現(xiàn)了一個 IP 歸屬地查詢接口,使用 ip2region 離線庫做到快速查詢,性能高效且無需依賴外部服務(wù)。這個小工具既能單獨運行,也能嵌入到日志分析、Web 服務(wù)或安全監(jiān)控系統(tǒng)中使用,是 Go 項目開發(fā)中的一個實用模塊。
到此這篇關(guān)于基于Go語言開發(fā)一個 IP 歸屬地查詢接口工具的文章就介紹到這了,更多相關(guān)Go查詢IP歸屬地內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang調(diào)用windows平臺的dll庫的方法實現(xiàn)
本文主要介紹了golang調(diào)用windows平臺的dll庫的方法實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-03-03
基于Go語言搭建靜態(tài)文件服務(wù)器的詳細(xì)教程
Go 是一個開源的編程語言,它能讓構(gòu)造簡單、可靠且高效的軟件變得容易,本文給大家介紹了基于Go語言搭建靜態(tài)文件服務(wù)器的詳細(xì)教程,文中通過圖文和代碼講解的非常詳細(xì),需要的朋友可以參考下2024-10-10

