
IP地址工具类
高德实现
高德地图key申请:https://lbs.amap.com/
java
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class IPUtils {
// 请替换为您自己的高德地图API Key
private static final String API_KEY = "YOUR_API_KEY";
private static final String API_URL = "https://restapi.amap.com/v5/ip?key=%s&ip=%s";
private static final int TIMEOUT = 5000; // 超时时间5秒
/**
* 获取IP地址的详细信息(字符串形式)
* @param ip IP地址
* @return 格式:"广东省深圳市" 或 "北京市"
*/
public static String getIpDetailAsString(String ip) {
IpInfo ipInfo = getIpInfo(ip);
if (ipInfo == null) return null;
String province = ipInfo.getProvince();
String city = ipInfo.getCity();
String district = ipInfo.getDistrict();
StringBuilder sb = new StringBuilder(province);
// 避免重复添加直辖市名称
if (!province.equals(city)) sb.append(city);
if (!district.isEmpty()) sb.append(district);
return sb.toString();
}
/**
* 获取IP地址的详细信息(对象形式)
* @param ip IP地址
* @return IpInfo对象,包含省市信息
*/
public static IpInfo getIpDetailAsObject(String ip) {
return getIpInfo(ip);
}
// 核心查询方法
private static IpInfo getIpInfo(String ip) {
try {
URL url = new URL(String.format(API_URL, API_KEY, ip));
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(TIMEOUT);
conn.setReadTimeout(TIMEOUT);
if (conn.getResponseCode() != 200) return null;
BufferedReader reader = new BufferedReader(
new InputStreamReader(conn.getInputStream(), "UTF-8"));
StringBuilder response = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
response.append(line);
}
reader.close();
JSONObject json = new JSONObject(response.toString());
if (!"1".equals(json.getString("status"))) return null;
IpInfo info = new IpInfo();
info.setProvince(json.getString("province"));
info.setCity(json.getString("city"));
info.setDistrict(""); // 高德接口暂无区县信息
return info;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
// IP信息封装类
public static class IpInfo {
private String province;
private String city;
private String district;
// Getters and Setters
public String getProvince() { return province; }
public void setProvince(String province) { this.province = province; }
public String getCity() { return city; }
public void setCity(String city) { this.city = city; }
public String getDistrict() { return district; }
public void setDistrict(String district) { this.district = district; }
}
}
测试
java
public static void main(String[] args) {
String ip = "114.247.50.2";
// 获取字符串形式地址
String address = IPUtils.getIpDetailAsString(ip);
System.out.println("字符串形式:" + address);
// 获取对象形式地址
IPUtils.IpInfo info = IPUtils.getIpDetailAsObject(ip);
if (info != null) {
System.out.println("对象形式:");
System.out.println("省份:" + info.getProvince());
System.out.println("城市:" + info.getCity());
System.out.println("区县:" + info.getDistrict());
}
}
注意事项:
- 精度限制:IP定位通常只能精确到市级,区县信息可能无法获取
- 服务限制:免费版API有调用次数限制(日配额2000次)
- 性能优化:建议添加缓存机制避免频繁调用API