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


maven依赖
<!--ip2region--><dependency><groupId>org.lionsoul</groupId><artifactId>ip2region</artifactId><version>1.7.2</version></dependency>
创建IPUtils工具类
【java如何根据IP获取当前区域天气信息详解】@Log4j2public 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*/@SneakyThrowspublic 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();//获取外网IPif (StringUtils.isBlank(publicIp)) return ResultUtils.error("获取失败");String cityInfo = IPUtils.getAddress(publicIp);//国家|区域|省份|城市|ISPif (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获取当前区域天气信息的文章就介绍到这了,更多相关java获取当前区域天气信息内容请搜索趣讯吧以前的文章或继续浏览下面的相关文章希望大家以后多多支持趣讯吧!
推荐阅读
- WPS如何撤销和恢复
- 14点30分是什么时辰
- 电脑如何调节亮度 笔记本亮度调节的方法
- 如何制作大枣年糕
- 欢乐斗地主怎么送好友欢乐豆 欢乐斗地主如何送好友欢乐豆
- 明日方舟怎么在电脑上玩 明日方舟如何在电脑上玩
- 途游斗地主怎么换绑定 途游斗地主如何换绑定
- 欢乐斗地主怎么和好友一起玩 欢乐斗地主如何邀请和好友一起玩
- 欢乐斗地主怎么邀请好友 欢乐斗地主如何邀请好友
- 明日方舟怎么注销账号 明日方舟如何注销账号
