用Java的方式封裝了一個天氣的接口,查詢了好多,要麼是要收費的,要麼需要使用官方的密匙Key。
總不能項目上線了還要告訴運維記得換個key吧,想想就就得不現實。
1、接口介紹
所以,小編列舉了幾個網站,供大家使用,不需要key,完全免費,絕無後顧之憂:
首先,當然是【國國家氣象局】中天氣預報提供的接口,總共三個:
- http://www.weather.com.cn/data/sk/101010100.html;
- http://www.weather.com.cn/data/cityinfo/101010100.html;
- http://m.weather.com.cn/data/101010100.html;(已停用!!)
注意:
上面url中的“101010100”是城市代碼,這裏指代“北京”的城市代碼。只需要改變城市代碼,就可以得到所在城市的天氣信息。其中,最詳細的信息來自第三個接口,但是該接口已經停用了。
第一個,第二個目前可用,但是查詢的信息並不全,也不支持未來幾天的天氣預報等信息。
但是,實際業務中我們有必要檢索一個天氣數據既全面,有支持未來幾天預告的API。
所以,再推薦幾個來自【萬年曆】的天氣預報查詢接口,總結兩個:
- http://wthrcdn.etouch.cn/weather_mini?city=北京;
- http://www.sojson.com/open/api/weather/json.shtml?city=北京;
這兩個接口還有一個明顯的優勢:不需要維護城市代碼,可以使用城市名稱進行天氣查詢,非常nice。
第二個天氣API詳情介紹在 API 中心:http://www.sojson.com/api/weather.html ,該接口經常發生變化,若無法訪問請訪問官網查看最新地址。
所以,小編寫一下【萬年曆】的第一個接口【wthrcdn.etouch.cn】的Demo:
2、使用方法
天氣實體類:WeatherInfo
public class WeatherInfo {
private String date; //時間
private String week; //星期
private String lunar; //農曆時間
private String cityname; //城市名
private String weather; //天氣
private String temp; //當前溫度
private String highTemp; //最低溫度
private String lowTemp; //當前溫度
private String tips; //小提示
... (省略get,set,toString方法)
}
天氣工具類:WeatherUtil
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.zip.GZIPInputStream;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
/**
* @author :tjm
* 通過get請求向網站:http://wthrcdn.etouch.cn/weather_mini 獲取某個 城市的天氣狀況數據,數據格式是Json
* @date :Created in 2020/3/9 13:55
*
*/
public class WeatherUtils {
private static String weatherUrl = "http://wthrcdn.etouch.cn/weather_mini?city=";
/**
* 通過城市名稱獲取該城市的天氣信息
*/
public static String GetWeatherData(String cityname) {
StringBuilder sb = new StringBuilder();
BufferedReader reader = null;
try {
URL url = new URL(weatherUrl + cityname);
URLConnection conn = url.openConnection();
InputStream is = conn.getInputStream();
GZIPInputStream gzin = new GZIPInputStream(is);
// 設置讀取流的編碼格式,自定義編碼
InputStreamReader isr = new InputStreamReader(gzin, "utf-8");
reader = new BufferedReader(isr);
String line = null;
while((line = reader.readLine()) != null){
sb.append(line + " ");
}
reader.close();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return sb.toString();
}
/**
* 將JSON格式數據進行解析 ,返回一個weather對象
*/
public static WeatherInfo GetWeather(String weatherInfobyJson){
JSONObject dataOfJson = JSONObject.fromObject(weatherInfobyJson); // json天氣數據
if(dataOfJson.getInt("status") != 1000){
return null;
}
// 創建WeatherInfo對象,提取所需的天氣信息
WeatherInfo weatherInfo = new WeatherInfo();
// 獲取當前日期:日期、星期
Calendar cal = Calendar.getInstance(); // Calendar類的實例化
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy年MM月dd日"); // 時間的格式化
weatherInfo.setDate(sdf1.format(cal.getTime())); // 時間
SimpleDateFormat sdf2 = new SimpleDateFormat("EEEE");
weatherInfo.setWeek(sdf2.format(cal.getTime())); // 星期
// 從json數據中提取數據:城市、溫度、小提醒
dataOfJson = JSONObject.fromObject(dataOfJson.getString("data"));
weatherInfo.setCityname(dataOfJson.getString("city")); // 城市
weatherInfo.setTemp(dataOfJson.getString("wendu")); // 溫度
weatherInfo.setTips(dataOfJson.getString("ganmao")); // 小提示
// 獲取今天的天氣預報信息:最高溫度、最低溫度、天氣
JSONArray forecast = dataOfJson.getJSONArray("forecast");
JSONObject result = forecast.getJSONObject(0);
weatherInfo.setHighTemp(result.getString("high").substring(2)); // 最高氣溫
weatherInfo.setLowTemp(result.getString("low").substring(2)); // 最低氣溫
weatherInfo.setWeather(result.getString("type")); // 天氣
return weatherInfo;
}
}
測試代碼:test
public class Test {
public static void main(String[] args){
String info = WeatherUtils.GetWeatherData("天津");
System.out.println("1.預測結果:" + info); // 全部天氣數據,含預測
WeatherInfo weatherinfo = WeatherUtils.GetWeather(info);
System.out.println("2.今天天氣:" + weatherinfo.toString()); // 當天天氣數據
}
}
結果:
1.預測結果:
{
"data": {
"yesterday": {
"date": "9日星期一",
"high": "高溫 8℃",
"fx": "東北風",
"low": "低溫 1℃",
"fl": "<![CDATA[4-5級]]>",
"type": "小雨"
},
"city": "天津",
"forecast": [
{
"date": "10日星期二",
"high": "高溫 13℃",
"fengli": "<![CDATA[4-5級]]>",
"low": "低溫 3℃",
"fengxiang": "西北風",
"type": "晴"
},
{
"date": "11日星期三",
"high": "高溫 16℃",
"fengli": "<![CDATA[4-5級]]>",
"low": "低溫 4℃",
"fengxiang": "西南風",
"type": "晴"
},
{
"date": "12日星期四",
"high": "高溫 16℃",
"fengli": "<![CDATA[4-5級]]>",
"low": "低溫 2℃",
"fengxiang": "東北風",
"type": "多雲"
},
{
"date": "13日星期五",
"high": "高溫 8℃",
"fengli": "<![CDATA[3-4級]]>",
"low": "低溫 0℃",
"fengxiang": "北風",
"type": "多雲"
},
{
"date": "14日星期六",
"high": "高溫 10℃",
"fengli": "<![CDATA[4-5級]]>",
"low": "低溫 2℃",
"fengxiang": "西北風",
"type": "晴"
}
],
"ganmao": "天冷風大且晝夜溫差也很大,易發生感冒,請注意適當增減衣服。",
"wendu": "9"
},
"status": 1000,
"desc": "OK"
}
2.今天天氣:
WeatherInfo{date='2020年03月10日', week=星期二, lunar='null', cityname='天津', weather='晴', temp='9', highTemp=' 13℃', lowTemp=' 3℃', tips='天冷風大且晝夜溫差也很大,易發生感冒,請注意適當增減衣服。'}
注意:
- 預測結果:是該API獲取的全部數據,包含昨天,今天,以及未來4天的天氣情況;
- 今天天氣:是從預測結果JSON數據中取出來,封裝成對象的數據,在data.forecast下的第一條記錄中。
更多精彩,請關注我的"今日頭條號":Java雲筆記
隨時隨地,讓你擁有最新,最便捷的掌上雲服務