使用介面獲取天氣
阿新 • • 發佈:2019-01-26
public static String getWeather(String city) throws MalformedURLException, IOException { String cityName=URLEncoder.encode(city,"UTF-8");//城市名 String url="//這裡寫你呼叫的天氣介面,例如心知api,聚合api 有免費的天氣介面"; URLConnection con= new URL(url).openConnection(); con.connect(); InputStream in=con.getInputStream(); BufferedReader reader=new BufferedReader(new InputStreamReader(in,"UTF-8")); String line=null; StringBuffer stringB=new StringBuffer(); while((line=reader.readLine())!=null) { stringB.append(line); } return stringB.toString();//這裡返回介面傳來的json資訊 } //如果是做程式或者網頁需要用到這個工具類,最好用資料庫把一個城市的天氣存起來。(最好直接把返回的json資訊存到庫中)這樣同一個城市的多個使用者就不用頻繁呼叫介面。充當快取的作用!減少呼叫。當超過一定時間再向資料庫更新天氣。(畢竟介面呼叫次數有限)
例如 資料庫存四個欄位 city(主鍵) weather(直接把介面返回的天氣資訊存進去 text型別) updatatime(記錄更新的時間) gap(時間間隔) 當呼叫介面的時間和資料庫中的updatime之差超過gap 就會呼叫介面,再把當前的時間和天氣資訊存入庫中。這樣就可以起到一個快取作用,同一城市,無論當前使用者多少,只要在時間範圍內,請求天氣都是直接從資料庫中獲取天氣資訊,而不是請求介面,這樣就可以節省介面呼叫次數!
public static String updata(String cityname) throws Exception {
String city=cityname;
ResultSet rs=null;
PreparedStatement pt=null;
DBUtil.connect();
pt=DBUtil.getPrepStmt("SELECT * FROM weatherupdata where cityname=?");
pt.setString(1, city);
rs=pt.executeQuery();
if(rs.next()) {
//當超過一定期限再把新的天氣更新到庫中,否則直接返回資料庫中存的天氣資訊,即可減少呼叫
if((System.currentTimeMillis() - rs.getLong(3)) / 1000 / 60 > rs.getInt(4)) {pt = DBUtil.getPrepStmt("UPDATE weatherupdata set jsondata=?,updatetime=? where cityname=?");
String jsondata=WeatherTest.getWeather(city);
pt.setString(1, jsondata);
pt.setLong(2, System.currentTimeMillis());
pt.setString(3, city);
pt.executeUpdate();
return jsondata;
}
else {
return rs.getString(2);
}
}else {
String jsondata=WeatherTest.getWeather(city);
pt=DBUtil.getPrepStmt("INSERT INTO weatherupdata(cityname,jsondata,updatetime) " + "VALUES(?,?,?)");
pt.setString(1, city);
pt.setString(2, jsondata);
pt.setLong(3, System.currentTimeMillis());
pt.executeUpdate();
return jsondata;
}
}