最近公司新项目首页需要实时获取天气信息,网上查资料研究了一下,通过城市名称获取天气信息。
1、工具类:通过城市名称向中华网年历上获取天气信息,具体代码如下:
package com.troy.emergency.gis.web.rest.util; import com.troy.emergency.gis.dto.WeatherInfo; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import javax.servlet.http.HttpServletRequest; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.*; import java.util.zip.GZIPInputStream; /** * @Author: CaoTing * @Description: 通过get请求向中华万年历网站http://wthrcdn.etouch.cn/weather_mini获取某个城市的天气状况数据,数据格式是Json * @Date: 2019/7/4 */ public class WeatherUtils { /** * 通过城市名称获取该城市的天气信息 * * @param cityName * @return */ public static String getWeatherData(String cityName) { StringBuilder sb=new StringBuilder();; try { cityName = URLEncoder.encode(cityName, "UTF-8"); String weatherRrl = "http://wthrcdn.etouch.cn/weather_mini?city="+cityName; // String weatherRrl = "https://free-api.heweather.net/s6/weather/now?location="+cityName+"&key=db86a5196f304e52a4369818c5182e60"; URL url = new URL(weatherRrl); URLConnection conn = url.openConnection(); InputStream is = conn.getInputStream(); GZIPInputStream gzin = new GZIPInputStream(is); // 设置读取流的编码格式,自定义编码 InputStreamReader isr = new InputStreamReader(gzin, "utf-8"); BufferedReader reader = new BufferedReader(isr); String line = null; while((line=reader.readLine())!=null) { sb.append(line).append(" "); } reader.close(); } catch (IOException e) { e.printStackTrace(); } return sb.toString(); } /** * 将JSON格式数据进行解析 ,返回一个weather对象 * @param weatherInfoByJson * @return */ public static WeatherInfo getWeather(String weatherInfoByJson){ JSONObject dataOfJson = JSONObject.fromObject(weatherInfoByJson); if(dataOfJson.getInt("status")!=1000) { return null; } //创建WeatherInfo对象,提取所需的天气信息 WeatherInfo weatherInfo = new WeatherInfo(); //从json数据中提取数据 String data = dataOfJson.getString("data"); System.out.println(data); dataOfJson = JSONObject.fromObject(data); weatherInfo.setCityName(dataOfJson.getString("city")); weatherInfo.setGanMao(dataOfJson.optString("ganmao")); weatherInfo.setTemperature(dataOfJson.optString("wendu")+"℃"); //获取预测的天气预报信息 JSONArray forecast = dataOfJson.getJSONArray("forecast"); //取得当天的 JSONObject result=forecast.getJSONObject(0); weatherInfo.setDate(result.getString("date")); String high = result.getString("high").substring(2); String low = result.getString("low").substring(2); weatherInfo.setTemperatureRange(low+"~"+high); weatherInfo.setWeather(result.getString("type")); return weatherInfo; } }
2、实体类,代码如下:
package com.troy.emergency.gis.dto; import lombok.Data; /** * @Author: CaoTing * @Description: * @Date: 2019/7/4 */ @Data public class WeatherInfo { /** * 时间 */ private String date; /** * 城市名 */ private String cityName; /** * 天气 */ private String weather; /** * 气温 */ private String temperatureRange; /** * 感冒 */ private String ganMao; /** * 当前温度 */ private String temperature; @Override public String toString() { return "WeatherInfo [date=" + date + ", cityName=" + cityName + ", weather=" + weather + ", temperature=" + temperature+"]"; } }
3、测试类,代码如下:
package com.troy.emergency.gis.web.rest.vm; import com.troy.emergency.gis.web.rest.util.WeatherUtils; public class test { public static void main(String[] args){ String info = WeatherUtils.getWeatherData("成都"); System.out.println(WeatherUtils.getWeather(info)); } }
4、输入结果,如下图所示: