IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 根据ip获取天气 -> 正文阅读

[网络协议]根据ip获取天气

 @ApiOperation(value = "自助机-获取天气信息")
    @GetMapping("/weather")
    public CommonResult getWeather(@ApiParam(name = "publicIp", value = "外网ip", required = true)@RequestParam(value = "publicIp")  String publicIp){
        log.info("publicIp-----------------请求外网ip"+publicIp);
        String cityInfo = IPUtils.getCityInfo(publicIp);//国家|区域|省份|城市|ISP
        if (StringUtils.isBlank(cityInfo)){
            return CommonResult.failed("获取失败");
        }
        String[] split = cityInfo.split("\\|");
        String city = "";
        for (String aSplit : split) {
            if (aSplit.contains("市")){
                city = aSplit;//拿取市级名称
            }
        }
        if (StringUtils.isBlank(city)) {
            return CommonResult.failed("获取失败");
        }
        String weatherInformation = HttpUtil.get("http://portalweather.comsys.net.cn/weather03/api/weatherService/getDailyWeather?cityName=" + city);//调用天气接口
        if (StringUtils.isBlank(weatherInformation)){
            return CommonResult.failed("获取失败");
        }
        Weather weather= JSONUtil.toBean(weatherInformation, Weather.class);
        WeatherDto weatherDto = weather.getResults().get(0);
        List<DailyDto> daily = weatherDto.getDaily();
        List<SsmWeather> ssmWeathers=machineHomePageService.querySsmWeather();
        Map<String, String> map = ssmWeathers.stream().collect(Collectors.toMap(SsmWeather::getRemarks, SsmWeather::getIcon));
        for (DailyDto dailyDto : daily) {
            if(map.containsKey(dailyDto.getText_day())){
                dailyDto.setText_day_icon(map.get(dailyDto.getText_day()));
            }else{
                dailyDto.setText_day_icon(map.get("未知"));
            }
            if(map.containsKey(dailyDto.getText_night())){
                dailyDto.setText_night_icon(map.get(dailyDto.getText_night()));
            }else{
                dailyDto.setText_night_icon(map.get("未知"));
            }
        }
        return CommonResult.success(weatherDto);
    }
public static String getCityInfo(String ip) {

        String dbPath = createFtlFileByFtlArray() + "ip2region.db";
        File file = new File(dbPath);
        if (file.exists() == false) {
            System.out.println("Error: Invalid ip2region.db file");
        }

        //查询算法
        //B-tree, B树搜索(更快)
        int algorithm = DbSearcher.BTREE_ALGORITHM;

        //Binary,使用二分搜索
        //DbSearcher.BINARY_ALGORITHM

        //Memory,加载内存(最快)
        //DbSearcher.MEMORY_ALGORITYM
        try {
            DbConfig config = new DbConfig();
            DbSearcher searcher = new DbSearcher(config, dbPath);

            //define the method
            Method method = null;
            switch (algorithm) {
                case DbSearcher.BTREE_ALGORITHM:
                    method = searcher.getClass().getMethod("btreeSearch", String.class);
                    break;
                case DbSearcher.BINARY_ALGORITHM:
                    method = searcher.getClass().getMethod("binarySearch", String.class);
                    break;
                case DbSearcher.MEMORY_ALGORITYM:
                    method = searcher.getClass().getMethod("memorySearch", String.class);
                    break;
                default:
                    System.out.println("default");
                    break;
            }

            DataBlock dataBlock = null;
            if (Util.isIpAddress(ip) == false) {
                System.out.println("Error: Invalid ip address");
            }

            dataBlock = (DataBlock) method.invoke(searcher, ip);
            String ipInfo = dataBlock.getRegion();
            if (!StringUtils.isEmpty(ipInfo)) {
                ipInfo = ipInfo.replace("|0", "");
                ipInfo = ipInfo.replace("0|", "");
            }
            return ipInfo;

        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }
 /**
     * 创建ip2region文件
     * @return
     */
    public static String createFtlFileByFtlArray() {
        String ftlPath = "db/";
        return createFtlFile(ftlPath, "ip2region.db");
    }
/**
     * 创建文件
     * @param ftlPath
     * @param ftlName
     * @return
     */
    private static String createFtlFile(String ftlPath, String ftlName) {
        InputStream certStream = null;
        try {
            //获取当前项目所在的绝对路径
            String proFilePath = System.getProperty("user.dir");

            //获取模板下的路径,然后存放在temp目录下 
            String newFilePath = proFilePath + File.separator + "temp" + File.separator + ftlPath;
            newFilePath = newFilePath.replace("/", File.separator);
            //检查项目运行时的src下的对应路径
            File newFile = new File(newFilePath + ftlName);
            if (newFile.isFile() && newFile.exists()) {
                return newFilePath;
            }
            //当项目打成jar包会运行下面的代码,并且复制一份到src路径下(具体结构看下面图片)
            certStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(ftlPath + ftlName);
            byte[] certData = org.apache.commons.io.IOUtils.toByteArray(certStream);
            org.apache.commons.io.FileUtils.writeByteArrayToFile(newFile, certData);
            return newFilePath;
        } catch (Exception e) {
            log.error(e.getMessage());
        } finally {
            try {
                certStream.close();
            } catch (Exception e) {
                log.error(e.getMessage());
            }
        }
        return null;
    }
package com.crm.core.dto;

import io.swagger.annotations.ApiModel;
import lombok.Data;

import java.io.Serializable;

/**
 * @author c-tangck
 * @description 天气预报图标
 */
@Data
@ApiModel(value = "天气预报图标")
public class SsmWeather {
    private String remarks;
    private String icon;
}
package com.crm.ssm.dto;

import io.swagger.annotations.ApiModel;
import lombok.Data;

/**
 * @author c-tangck
 * @description 天气预报-天气
 */
@Data
@ApiModel(value = "天气预报-天气")
public class DailyDto {

    private String date;
    private String text_day;
    private String text_day_icon;
    private String code_day;
    private String text_night;
    private String text_night_icon;
    private String code_night;
    private String high;
    private String low;
    private String rainfall;
    private String precip;
    private String wind_direction;
    private String wind_direction_degree;
    private String wind_speed;
    private String wind_scale;
    private String humidity;
}

下载开源ip2region.db文件到项目resources目录下

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-04-07 23:04:59  更:2022-04-07 23:05:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 4:40:36-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码