免費天氣API,可以獲取全國範圍五天內的天氣預報(含完整Demo)

用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雲筆記
隨時隨地,讓你擁有最新,最便捷的掌上雲服務

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章