java如何根據(jù)IP獲取當(dāng)前區(qū)域天氣信息詳解
大致思路是客戶端發(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)容的最后一行,寫(xiě)入
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)盤(pán)上了,有需要的可以下載一下
下載地址:點(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中使用Java?Mail實(shí)現(xiàn)郵件服務(wù)功能示例
這篇文章主要介紹了Java中使用Java?Mail實(shí)現(xiàn)郵件服務(wù)功能的相關(guān)資料,文章還提供了一個(gè)發(fā)送郵件的示例代碼,包括創(chuàng)建參數(shù)類、郵件類和執(zhí)行結(jié)果,需要的朋友可以參考下2025-01-01
java GUI編程之監(jiān)聽(tīng)操作實(shí)例分析
這篇文章主要介紹了java GUI編程之監(jiān)聽(tīng)操作,結(jié)合實(shí)例形式分析了java GUI編程監(jiān)聽(tīng)操作的Button監(jiān)聽(tīng)、TextField文本輸入監(jiān)聽(tīng)等相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2020-01-01
springmvc 獲取@Requestbody轉(zhuǎn)換的異常處理方式
這篇文章主要介紹了springmvc 獲取@Requestbody轉(zhuǎn)換的異常處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
Spring Boot多模塊化后,服務(wù)間調(diào)用的坑及解決
這篇文章主要介紹了Spring Boot多模塊化后,服務(wù)間調(diào)用的坑及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
mybatis-plus開(kāi)啟sql打印的三種方式總結(jié)
這篇文章主要給大家介紹了mybatisplus開(kāi)啟sql打印的三種方式,文章通過(guò)代碼示例介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的參考價(jià)值,需要的朋友可以參考下2023-11-11
SpringBoot Tomcat漏洞修復(fù)的解決方法
本文主要介紹了SpringBoot Tomcat漏洞修復(fù)的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-04-04
SpringMVC使用@Valid注解實(shí)現(xiàn)數(shù)據(jù)驗(yàn)證的代碼示例
在 Web 開(kāi)發(fā)中,數(shù)據(jù)驗(yàn)證是一個(gè)非常重要的環(huán)節(jié),它可以確保數(shù)據(jù)的合法性和正確性,保護(hù)系統(tǒng)不受到惡意攻擊或用戶誤操作的影響,在 SpringMVC 中,我們可以使用 @Valid 注解來(lái)實(shí)現(xiàn)數(shù)據(jù)驗(yàn)證,所以本文就給大家介紹具體的使用方法,需要的朋友可以參考下2023-07-07

