Skip to content
鼓励作者:欢迎打赏犒劳

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

如有转载或 CV 的请标注本站原文地址