最近公司新項目首頁需要實時獲取天氣信息,網上查資料研究了一下,通過城市名稱獲取天氣信息。
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、輸入結果,如下圖所示: