欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java如何根據(jù)IP獲取當(dāng)前區(qū)域天氣信息詳解

 更新時(shí)間:2021年08月03日 12:29:38   作者:Kiss  
根據(jù)IP自動(dòng)獲取當(dāng)?shù)氐奶鞖忸A(yù)報(bào)信息這個(gè)功能大家應(yīng)該都遇到過(guò),天氣預(yù)報(bào)信息用途非常廣泛,篇文章主要給大家介紹了關(guān)于java如何根據(jù)IP獲取當(dāng)前區(qū)域天氣信息的相關(guān)資料,需要的朋友可以參考下

大致思路是客戶端發(fā)起請(qǐng)求,我們首先根據(jù)請(qǐng)求獲取到外網(wǎng)IP,然后再根據(jù)外網(wǎng)IP獲取到用戶所在城市,最后根據(jù)城市獲取到天氣信息

獲取外網(wǎng)IP

萬(wàn)網(wǎng)獲取外網(wǎng)IP地址:www.net.cn/static/cust

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

        URL url = new URL(path);// 創(chuàng)建url對(duì)象

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

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

        conn.setConnectTimeout(5 * 1000);// 請(qǐng)求的時(shí)間

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

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

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

        //用正則表達(dá)式提取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);
        }

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

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

根據(jù)外網(wǎng)IP獲取用戶所在城市

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

下載地址:點(diǎn)擊這里

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

引入ip2region.db

maven依賴

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

創(chuàng)建IPUtils工具類

@Log4j2
public class IPUtils {

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

    /**
     * 根據(jù)IP獲取地址
     *
     * @param ip
     * @param algorithm 查詢算法
     * @return 國(guó)家|區(qū)域|省份|城市|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("錯(cuò)誤格式的ip地址: {}", ip);
            return "";
        }
        String dbPath = IPUtils.class.getResource("/db/ip2region.db").getPath();
        File file = new File(dbPath);
        if (!file.exists()) {
            log.error("地址庫(kù)文件不存在");
            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();
    }

根據(jù)城市獲取天氣信息

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

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

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

總結(jié)

到此這篇關(guān)于java如何根據(jù)IP獲取當(dāng)前區(qū)域天氣信息的文章就介紹到這了,更多相關(guān)java獲取當(dāng)前區(qū)域天氣信息內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java必學(xué)必會(huì)之方法的重載(overload)

    java必學(xué)必會(huì)之方法的重載(overload)

    java必學(xué)必會(huì)之方法的重載,介紹了方法的重載、構(gòu)造方法的重載,想要學(xué)好java方法的重載的朋友一定要好好閱讀這篇文章
    2015-12-12
  • Java中的BaseTypeHandler自定義類型轉(zhuǎn)換器的使用

    Java中的BaseTypeHandler自定義類型轉(zhuǎn)換器的使用

    這篇文章主要介紹了Java中的BaseTypeHandler自定義類型轉(zhuǎn)換器的使用,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-05-05
  • Java8新特性-Lambda表達(dá)式詳解

    Java8新特性-Lambda表達(dá)式詳解

    Java 8 (又稱為 jdk 1.8) 是 Java 語(yǔ)言開(kāi)發(fā)的一個(gè)主要版本。Lambda 表達(dá)式,也可稱為閉包,它是推動(dòng) Java 8 發(fā)布的最重要新特性。本文通過(guò)詳細(xì)的代碼示例介紹了Java8新特性感興趣的朋友可以參考一下
    2023-04-04
  • SpringCloud配置中心Config過(guò)程解析

    SpringCloud配置中心Config過(guò)程解析

    這篇文章主要介紹了SpringCloud配置中心Config過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Java交換map的key和value值的步驟和代碼示例

    Java交換map的key和value值的步驟和代碼示例

    在Java中,我們都知道直接交換Map的key和value是不被允許的,因?yàn)镸ap的接口設(shè)計(jì)是基于key-value對(duì)的,其中key是唯一的,并且是不可變的,所以本文給大家介紹了Java交換map的key和value值的步驟和代碼示例,需要的朋友可以參考下
    2024-09-09
  • idea導(dǎo)入springboot項(xiàng)目沒(méi)有maven的解決

    idea導(dǎo)入springboot項(xiàng)目沒(méi)有maven的解決

    這篇文章主要介紹了idea導(dǎo)入springboot項(xiàng)目沒(méi)有maven的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • SpringBoot的WebSocket實(shí)現(xiàn)單聊群聊

    SpringBoot的WebSocket實(shí)現(xiàn)單聊群聊

    這篇文章主要為大家詳細(xì)介紹了SpringBoot的WebSocket實(shí)現(xiàn)單聊群聊,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-02-02
  • springboot集成redis存對(duì)象亂碼的問(wèn)題及解決

    springboot集成redis存對(duì)象亂碼的問(wèn)題及解決

    這篇文章主要介紹了springboot集成redis存對(duì)象亂碼的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Java基于裝飾者模式實(shí)現(xiàn)的染色饅頭案例詳解

    Java基于裝飾者模式實(shí)現(xiàn)的染色饅頭案例詳解

    這篇文章主要介紹了Java基于裝飾者模式實(shí)現(xiàn)的染色饅頭案例,簡(jiǎn)單描述了裝飾者模式的概念、原理及Java使用裝飾者模式的相關(guān)實(shí)現(xiàn)步驟、操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2018-05-05
  • Java實(shí)現(xiàn)遠(yuǎn)程控制技術(shù)完整源代碼分享

    Java實(shí)現(xiàn)遠(yuǎn)程控制技術(shù)完整源代碼分享

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)遠(yuǎn)程控制技術(shù)完整源代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-08-08

最新評(píng)論