中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java如何根據IP獲取當前區域天氣信息

發布時間:2021-08-03 15:12:14 來源:億速云 閱讀:195 作者:chen 欄目:開發技術

這篇文章主要介紹“java如何根據IP獲取當前區域天氣信息”,在日常操作中,相信很多人在java如何根據IP獲取當前區域天氣信息問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”java如何根據IP獲取當前區域天氣信息”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

大致思路是客戶端發起請求,我們首先根據請求獲取到外網IP,然后再根據外網IP獲取到用戶所在城市,最后根據城市獲取到天氣信息

獲取外網IP

萬網獲取外網IP地址:www.net.cn/static/cust…

/**
 * @Description:獲取客戶端外網ip 此方法要接入互聯網才行,內網不行
 **/
public static String getPublicIp() {
    try {
        String path = "http://www.net.cn/static/customercare/yourip.asp";// 要獲得html頁面內容的地址(萬網)

        URL url = new URL(path);// 創建url對象

        HttpURLConnection conn = (HttpURLConnection) url.openConnection();// 打開連接

        conn.setRequestProperty("contentType", "GBK"); // 設置url中文參數編碼

        conn.setConnectTimeout(5 * 1000);// 請求的時間

        conn.setRequestMethod("GET");// 請求方式

        InputStream inStream = conn.getInputStream();
        // readLesoSysXML(inStream);

        BufferedReader in = new BufferedReader(new InputStreamReader(
                inStream, "GBK"));
        StringBuilder buffer = new StringBuilder();
        String line;
        // 讀取獲取到內容的最后一行,寫入
        while ((line = in.readLine()) != null) {
            buffer.append(line);
        }
        List<String> ips = new ArrayList<>();

        //用正則表達式提取String字符串中的IP地址
        String regEx="((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)";
        String str = buffer.toString();
        Pattern p = Pattern.compile(regEx);
        Matcher m = p.matcher(str);
        while (m.find()) {
            String result = m.group();
            ips.add(result);
        }

        // 返回公網IP值
        return ips.get(0);

    } catch (Exception e) {
        System.out.println("獲取公網IP連接超時");
        return "";
    }
}

根據外網IP獲取用戶所在城市

首先你待需要一個ip2region.db文件,大家可以百度一下,我在這里整理了一份放在網盤上了,有需要的可以下載一下

下載地址:點擊這里

ip2region準確率99.9%的ip地址定位庫,0.0x毫秒級查詢,數據庫文件大小只有1.5M,提供了java,php,c,python,nodejs,golang查詢綁定和Binary,B樹,內存三種查詢算法

引入ip2region.db

java如何根據IP獲取當前區域天氣信息

maven依賴

<!--ip2region-->
<dependency>
    <groupId>org.lionsoul</groupId>
    <artifactId>ip2region</artifactId>
    <version>1.7.2</version>
</dependency>

創建IPUtils工具類

@Log4j2
public class IPUtils {

    /**
     * 根據IP獲取地址
     *
     * @return 國家|區域|省份|城市|ISP
     */
    public static String getAddress(String ip) {
        return getAddress(ip, DbSearcher.BTREE_ALGORITHM);
    }

    /**
     * 根據IP獲取地址
     *
     * @param ip
     * @param algorithm 查詢算法
     * @return 國家|區域|省份|城市|ISP
     * @see DbSearcher
     * DbSearcher.BTREE_ALGORITHM; //B-tree
     * DbSearcher.BINARY_ALGORITHM //Binary
     * DbSearcher.MEMORY_ALGORITYM //Memory
     */
    @SneakyThrows
    public static String getAddress(String ip, int algorithm) {
        if (!Util.isIpAddress(ip)) {
            log.error("錯誤格式的ip地址: {}", ip);
            return "";
        }
        String dbPath = IPUtils.class.getResource("/db/ip2region.db").getPath();
        File file = new File(dbPath);
        if (!file.exists()) {
            log.error("地址庫文件不存在");
            return "";
        }
        DbSearcher searcher = new DbSearcher(new DbConfig(), dbPath);
        DataBlock dataBlock;
        switch (algorithm) {
            case DbSearcher.BTREE_ALGORITHM:
                dataBlock = searcher.btreeSearch(ip);
                break;
            case DbSearcher.BINARY_ALGORITHM:
                dataBlock = searcher.binarySearch(ip);
                break;
            case DbSearcher.MEMORY_ALGORITYM:
                dataBlock = searcher.memorySearch(ip);
                break;
            default:
                log.error("未傳入正確的查詢算法");
                return "";
        }
        searcher.close();
        return dataBlock.getRegion();
    }

根據城市獲取天氣信息

第三方天氣接口:portalweather.comsys.net.cn/weather03/a…

調用第三方天氣接口獲取天氣信息,本文使用java自帶工具類HttpUtils

@GetMapping("/weather")
@DecryptBody(encode = true) //響應加密
public Result getWeather(){
    String publicIp = GetIPUtils.getPublicIp();//獲取外網IP
    if (StringUtils.isBlank(publicIp)) return ResultUtils.error("獲取失敗");
    String cityInfo = IPUtils.getAddress(publicIp);//國家|區域|省份|城市|ISP
    if (StringUtils.isBlank(cityInfo)) return ResultUtils.error("獲取失敗");
    String[] split = cityInfo.split("\|");
    String city = "";
    for (String aSplit : split) if (aSplit.contains("市")) city = aSplit;//拿取市級名稱
    if (StringUtils.isBlank(city)) return ResultUtils.error("獲取失敗");
    String weatherInformation = HttpUtil.get("http://portalweather.comsys.net.cn/weather03/api/weatherService/getDailyWeather?cityName=" + city);//調用天氣接口
    if (StringUtils.isBlank(weatherInformation)) return ResultUtils.error("獲取失敗");
    Object o = ObjectMapperUtils.strToObj(weatherInformation,Object.class);
    return ResultUtils.success("獲取成功",o);
}

到此,關于“java如何根據IP獲取當前區域天氣信息”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

普宁市| 双流县| 句容市| 中江县| 库伦旗| 同仁县| 治多县| 自贡市| 丰镇市| 梅州市| 靖宇县| 涪陵区| 汽车| 九寨沟县| 桦南县| 遵义市| 甘泉县| 扎赉特旗| 桃源县| 富平县| 景泰县| 东乌珠穆沁旗| 和平区| 庆元县| 贵溪市| 呼伦贝尔市| 巨野县| 镇赉县| 滦平县| 阿荣旗| 石阡县| 池州市| 五家渠市| 马关县| 六安市| 民和| 绥滨县| 洛南县| 托克托县| 仁寿县| 扎兰屯市|