1. 程式人生 > >使用介面獲取天氣

使用介面獲取天氣

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;
}
}