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