ASP.NET Core 2 使用 HttpClientFactory 讀取中央氣象局 OpenData 的 API (json格式)


帳號申請方式可以參考前一篇文章:
ASP.NET Core 2 使用 HttpClientFactory 讀取中央氣象局 OpenData 的XML下載→註冊CWB會員

以下稱中央氣象局 OpenData 平台為 CWBODP

這個API服務是提供給APP使用的,畢竟XML格式對行動裝置的運算解讀能力與傳輸資料量都是很傷的(消耗資源),操作起來也不是那麼便利,雖然它(XML)比較嚴謹。

CWODP 取用 API 資料的 URI:
https://opendata.cwb.gov.tw/api/v1/rest/datastore/{資料代碼}?Authorization={授權碼}

前面篇章已經講述過 HttpClientFactory 的用法了,所以這裡我只演示直接處理接收後的資料方式。

首先在 startup.cs 裡面的 ConfigureServices 定義讀取方法(以讀取F-C0032-001資料為例):
startup.cs
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddHttpClient("CWBAPI", c =>
            {
                c.BaseAddress = new Uri("https://opendata.cwb.gov.tw/api/v1/rest/datastore/F-C0032-001?Authorization=CWB-1234ABCD-78EF-GH90-12XY-IJKL12345678");
                c.DefaultRequestHeaders.Add("Accept", "*/*");
                c.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 5.1; rv:7.0.1) Gecko/20100101 Firefox/7.0.1");
            });
            services.AddMvc(); 
        }


然後,在需要使用的地方(例如 Controller )注入服務,並呼叫它,下面處理資料使用了json的處理方式,所以記得要用

using Newtonsoft.Json.Linq;

CWBController.cs
namespace CWBReader.Controllers
{
    [Route("[controller]")]
    public class CWBController : Controller
    {
        private readonly IHttpClientFactory _httpClientFactory;

        public CWBController(IHttpClientFactory httpClientFactory)
        {
            _httpClientFactory = httpClientFactory;
        }

        [Route("t5")]
        public async Task<ContentResult> GetCWB05()
        {
            //取用已經註冊的 CWBAPI 服務
            HttpClient client = _httpClientFactory.CreateClient("CWBAPI");
            string content = "";

            using (var result = await client.GetAsync(""))
            {
                if (result.IsSuccessStatusCode)
                {
                    string jsonSource = await result.Content.ReadAsStringAsync();
                    JObject js = JObject.Parse(jsonSource);

                    //先取得時間點,36小時資訊有3個時間點,我要把每個相同時間區資訊統一在一起
                    List<TimeBlock> tBlock = new List<TimeBlock>();

                    var a1 = (from cc in (from bb in (from aa in js["records"]["location"] select aa).First()["weatherElement"] select bb).First()["time"] select cc);
                    foreach(var ts in a1)
                    {
                        content += ts["startTime"].ToString() + " - " + ts["endTime"].ToString() + "<br />";
                        TimeBlock tb = new TimeBlock();
                        tb.Start = ts["startTime"].ToString();
                        tb.End = ts["endTime"].ToString();
                        tBlock.Add(tb);
                    }
                    // 列出城市
                    var citys = (from aa in js["records"]["location"] select aa);
                    foreach(var city in citys)
                    {
                        content += "&nbsp;&nbsp;<h3>" + city["locationName"].ToString() + "</h3><br />";
                        //取得城市天氣資訊
                        int timePos = 1;
                        //以時間區段分類列表(原本資料結構是使用天氣項目分類列表,不易閱讀)
                        foreach (var tb in tBlock)
                        {
                            content += "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
                            if (timePos == 1)
                            {
                                content += "今天白天&nbsp;&nbsp;";
                            }
                            else if (timePos == 2)
                            {
                                content += "今晚明晨&nbsp;&nbsp;";
                            }
                            else
                            {
                                content += "明天白天&nbsp;&nbsp;";
                            }
                            timePos++;

                            content += "(" + ParseDatetime2(tb.Start).ToString("dd日 HH時") +
                                    " ~ " + ParseDatetime2(tb.End).ToString("dd日 HH時") + ")<br />";
                         
                           //以 LINQ 條件查詢該時間段的天氣資訊
                            var wx = (from cc in 
                                          (from bb in city["weatherElement"]
                                           where bb["elementName"].ToString() == "Wx"
                                           select bb).First()["time"]
                                      where cc["startTime"].ToString() == tb.Start
                                      select cc)
                                      .First()["parameter"]["parameterName"];
                            content += "&nbsp;天氣 ==>  " + wx.ToString() + "<br />";

                            var maxt = (from cc in
                                          (from bb in city["weatherElement"]
                                           where bb["elementName"].ToString().ToLower() == "maxt"
                                           select bb).First()["time"]
                                      where cc["startTime"].ToString() == tb.Start
                                      select cc)
                                      .First()["parameter"]["parameterName"];
                            var mint = (from cc in
                                          (from bb in city["weatherElement"]
                                           where bb["elementName"].ToString().ToLower() == "mint"
                                           select bb).First()["time"]
                                        where cc["startTime"].ToString() == tb.Start
                                        select cc)
                                      .First()["parameter"]["parameterName"];
                            content += "&nbsp;溫度 ==>  " + mint.ToString() + "&deg; ~ " + maxt.ToString() + "&deg;<br />";

                            var pop = (from cc in
                                          (from bb in city["weatherElement"]
                                           where bb["elementName"].ToString().ToLower() == "pop"
                                           select bb).First()["time"]
                                        where cc["startTime"].ToString() == tb.Start
                                        select cc)
                                      .First()["parameter"]["parameterName"];
                            content += "&nbsp;降雨率 ==>  " + pop.ToString() + "%<br />";

                            var ci = (from cc in
                                          (from bb in city["weatherElement"]
                                           where bb["elementName"].ToString().ToLower() == "ci"
                                           select bb).First()["time"]
                                       where cc["startTime"].ToString() == tb.Start
                                       select cc)
                                      .First()["parameter"]["parameterName"];
                            content += " 舒適度 ==>  " + ci.ToString() + "<br />";

                            content += "<br />";
                        }
                    }
                }
            }
            return Content(content, "text/html", System.Text.Encoding.UTF8);
        }
     
        //這裡對時間資料的解析與XML版本不一樣
        public DateTime ParseDatetime2(string timeString)
        {
            DateTime time1 = DateTime.ParseExact(timeString, "yyyy-MM-dd HH:mm:ss", System.Globalization.CultureInfo.CurrentCulture);
            int seconds = 0;
            time1 = time1.AddSeconds(seconds);
            return time1;
        }
    }
}


顯示結果:
2018-10-15 06:00:00 - 2018-10-15 18:00:00
2018-10-15 18:00:00 - 2018-10-16 06:00:00
2018-10-16 06:00:00 - 2018-10-16 18:00:00

嘉義縣

          今天白天  (15日 06時 ~ 15日 18時)
 天氣 ==> 多雲
 溫度 ==> 22° ~ 32°
 降雨率 ==> 0%
舒適度 ==> 舒適至悶熱

          今晚明晨  (15日 18時 ~ 16日 06時)
 天氣 ==> 多雲
 溫度 ==> 22° ~ 27°
 降雨率 ==> 10%
舒適度 ==> 舒適

          明天白天  (16日 06時 ~ 16日 18時)
 天氣 ==> 多雲
 溫度 ==> 22° ~ 30°
 降雨率 ==> 10%
舒適度 ==> 舒適至悶熱


新北市

          今天白天  (15日 06時 ~ 15日 18時)
 天氣 ==> 陰時多雲短暫雨
 溫度 ==> 22° ~ 27°
 降雨率 ==> 30%
舒適度 ==> 舒適

          今晚明晨  (15日 18時 ~ 16日 06時)
 天氣 ==> 陰時多雲短暫雨
 溫度 ==> 22° ~ 24°
 降雨率 ==> 30%
舒適度 ==> 舒適

          明天白天  (16日 06時 ~ 16日 18時)
 天氣 ==> 陰時多雲短暫雨
 溫度 ==> 22° ~ 26°
 降雨率 ==> 50%
舒適度 ==> 舒適


嘉義市

          今天白天  (15日 06時 ~ 15日 18時)
 天氣 ==> 多雲
 溫度 ==> 23° ~ 33°
 降雨率 ==> 10%
舒適度 ==> 舒適至悶熱

          今晚明晨  (15日 18時 ~ 16日 06時)
 天氣 ==> 多雲
 溫度 ==> 23° ~ 28°
 降雨率 ==> 10%
舒適度 ==> 舒適

          明天白天  (16日 06時 ~ 16日 18時)
 天氣 ==> 多雲
 溫度 ==> 23° ~ 30°
 降雨率 ==> 10%
舒適度 ==> 舒適至悶熱


新竹縣

          今天白天  (15日 06時 ~ 15日 18時)
 天氣 ==> 多雲時陰
 溫度 ==> 22° ~ 29°
 降雨率 ==> 10%
舒適度 ==> 舒適

          今晚明晨  (15日 18時 ~ 16日 06時)
 天氣 ==> 多雲時陰
 溫度 ==> 22° ~ 25°
 降雨率 ==> 20%
舒適度 ==> 舒適

          明天白天  (16日 06時 ~ 16日 18時)
 天氣 ==> 多雲短暫雨
 溫度 ==> 22° ~ 26°
 降雨率 ==> 30%
舒適度 ==> 舒適


新竹市

          今天白天  (15日 06時 ~ 15日 18時)
 天氣 ==> 多雲時陰
 溫度 ==> 22° ~ 29°
 降雨率 ==> 10%
舒適度 ==> 舒適

          今晚明晨  (15日 18時 ~ 16日 06時)
 天氣 ==> 多雲
 溫度 ==> 22° ~ 25°
 降雨率 ==> 10%
舒適度 ==> 舒適

          明天白天  (16日 06時 ~ 16日 18時)
 天氣 ==> 多雲短暫雨
 溫度 ==> 22° ~ 26°
 降雨率 ==> 30%
舒適度 ==> 舒適


臺北市

          今天白天  (15日 06時 ~ 15日 18時)
 天氣 ==> 多雲時陰短暫雨
 溫度 ==> 22° ~ 26°
 降雨率 ==> 50%
舒適度 ==> 舒適

          今晚明晨  (15日 18時 ~ 16日 06時)
 天氣 ==> 陰時多雲短暫雨
 溫度 ==> 21° ~ 24°
 降雨率 ==> 30%
舒適度 ==> 舒適

          明天白天  (16日 06時 ~ 16日 18時)
 天氣 ==> 陰時多雲短暫雨
 溫度 ==> 21° ~ 25°
 降雨率 ==> 40%
舒適度 ==> 舒適


臺南市

          今天白天  (15日 06時 ~ 15日 18時)
 天氣 ==> 多雲
 溫度 ==> 24° ~ 30°
 降雨率 ==> 0%
舒適度 ==> 舒適至悶熱

          今晚明晨  (15日 18時 ~ 16日 06時)
 天氣 ==> 多雲時晴
 溫度 ==> 24° ~ 27°
 降雨率 ==> 10%
舒適度 ==> 舒適

          明天白天  (16日 06時 ~ 16日 18時)
 天氣 ==> 多雲時晴
 溫度 ==> 24° ~ 29°
 降雨率 ==> 10%
舒適度 ==> 舒適


宜蘭縣

          今天白天  (15日 06時 ~ 15日 18時)
 天氣 ==> 陰時多雲短暫雨
 溫度 ==> 22° ~ 26°
 降雨率 ==> 80%
舒適度 ==> 舒適

          今晚明晨  (15日 18時 ~ 16日 06時)
 天氣 ==> 陰時多雲短暫雨
 溫度 ==> 22° ~ 24°
 降雨率 ==> 50%
舒適度 ==> 舒適

          明天白天  (16日 06時 ~ 16日 18時)
 天氣 ==> 陰時多雲短暫雨
 溫度 ==> 22° ~ 27°
 降雨率 ==> 60%
舒適度 ==> 舒適


苗栗縣

          今天白天  (15日 06時 ~ 15日 18時)
 天氣 ==> 多雲
 溫度 ==> 21° ~ 29°
 降雨率 ==> 10%
舒適度 ==> 舒適

          今晚明晨  (15日 18時 ~ 16日 06時)
 天氣 ==> 多雲
 溫度 ==> 22° ~ 25°
 降雨率 ==> 20%
舒適度 ==> 舒適

          明天白天  (16日 06時 ~ 16日 18時)
 天氣 ==> 多雲短暫雨
 溫度 ==> 22° ~ 26°
 降雨率 ==> 30%
舒適度 ==> 舒適


雲林縣

          今天白天  (15日 06時 ~ 15日 18時)
 天氣 ==> 多雲
 溫度 ==> 22° ~ 31°
 降雨率 ==> 0%
舒適度 ==> 舒適至悶熱

          今晚明晨  (15日 18時 ~ 16日 06時)
 天氣 ==> 多雲
 溫度 ==> 22° ~ 26°
 降雨率 ==> 10%
舒適度 ==> 舒適

          明天白天  (16日 06時 ~ 16日 18時)
 天氣 ==> 多雲
 溫度 ==> 22° ~ 29°
 降雨率 ==> 10%
舒適度 ==> 舒適至悶熱


花蓮縣

          今天白天  (15日 06時 ~ 15日 18時)
 天氣 ==> 多雲短暫雨
 溫度 ==> 22° ~ 28°
 降雨率 ==> 40%
舒適度 ==> 舒適至悶熱

          今晚明晨  (15日 18時 ~ 16日 06時)
 天氣 ==> 多雲短暫雨
 溫度 ==> 22° ~ 25°
 降雨率 ==> 30%
舒適度 ==> 舒適

          明天白天  (16日 06時 ~ 16日 18時)
 天氣 ==> 多雲時陰短暫雨
 溫度 ==> 22° ~ 27°
 降雨率 ==> 50%
舒適度 ==> 舒適


臺中市

          今天白天  (15日 06時 ~ 15日 18時)
 天氣 ==> 多雲時晴
 溫度 ==> 24° ~ 32°
 降雨率 ==> 10%
舒適度 ==> 舒適至悶熱

          今晚明晨  (15日 18時 ~ 16日 06時)
 天氣 ==> 多雲時晴
 溫度 ==> 24° ~ 28°
 降雨率 ==> 10%
舒適度 ==> 舒適

          明天白天  (16日 06時 ~ 16日 18時)
 天氣 ==> 多雲
 溫度 ==> 24° ~ 30°
 降雨率 ==> 10%
舒適度 ==> 舒適至悶熱


臺東縣

          今天白天  (15日 06時 ~ 15日 18時)
 天氣 ==> 多雲短暫雨
 溫度 ==> 23° ~ 30°
 降雨率 ==> 30%
舒適度 ==> 舒適至悶熱

          今晚明晨  (15日 18時 ~ 16日 06時)
 天氣 ==> 多雲時陰
 溫度 ==> 23° ~ 26°
 降雨率 ==> 10%
舒適度 ==> 舒適

          明天白天  (16日 06時 ~ 16日 18時)
 天氣 ==> 多雲時陰短暫雨
 溫度 ==> 23° ~ 29°
 降雨率 ==> 50%
舒適度 ==> 舒適至悶熱


桃園市

          今天白天  (15日 06時 ~ 15日 18時)
 天氣 ==> 陰時多雲短暫雨
 溫度 ==> 21° ~ 27°
 降雨率 ==> 30%
舒適度 ==> 舒適

          今晚明晨  (15日 18時 ~ 16日 06時)
 天氣 ==> 陰時多雲短暫雨
 溫度 ==> 21° ~ 24°
 降雨率 ==> 30%
舒適度 ==> 舒適

          明天白天  (16日 06時 ~ 16日 18時)
 天氣 ==> 多雲時陰短暫雨
 溫度 ==> 21° ~ 25°
 降雨率 ==> 30%
舒適度 ==> 舒適


南投縣

          今天白天  (15日 06時 ~ 15日 18時)
 天氣 ==> 多雲
 溫度 ==> 23° ~ 32°
 降雨率 ==> 0%
舒適度 ==> 舒適至悶熱

          今晚明晨  (15日 18時 ~ 16日 06時)
 天氣 ==> 多雲時晴
 溫度 ==> 23° ~ 28°
 降雨率 ==> 10%
舒適度 ==> 舒適

          明天白天  (16日 06時 ~ 16日 18時)
 天氣 ==> 多雲
 溫度 ==> 23° ~ 29°
 降雨率 ==> 10%
舒適度 ==> 舒適至悶熱


高雄市

          今天白天  (15日 06時 ~ 15日 18時)
 天氣 ==> 多雲
 溫度 ==> 25° ~ 30°
 降雨率 ==> 0%
舒適度 ==> 舒適至悶熱

          今晚明晨  (15日 18時 ~ 16日 06時)
 天氣 ==> 晴時多雲
 溫度 ==> 26° ~ 28°
 降雨率 ==> 10%
舒適度 ==> 舒適

          明天白天  (16日 06時 ~ 16日 18時)
 天氣 ==> 多雲時晴
 溫度 ==> 26° ~ 30°
 降雨率 ==> 10%
舒適度 ==> 舒適至悶熱


金門縣

          今天白天  (15日 06時 ~ 15日 18時)
 天氣 ==> 多雲短暫雨
 溫度 ==> 21° ~ 28°
 降雨率 ==> 30%
舒適度 ==> 舒適

          今晚明晨  (15日 18時 ~ 16日 06時)
 天氣 ==> 多雲時陰短暫雨
 溫度 ==> 22° ~ 24°
 降雨率 ==> 30%
舒適度 ==> 舒適

          明天白天  (16日 06時 ~ 16日 18時)
 天氣 ==> 多雲短暫雨
 溫度 ==> 22° ~ 27°
 降雨率 ==> 30%
舒適度 ==> 舒適


屏東縣

          今天白天  (15日 06時 ~ 15日 18時)
 天氣 ==> 多雲
 溫度 ==> 23° ~ 32°
 降雨率 ==> 20%
舒適度 ==> 舒適至悶熱

          今晚明晨  (15日 18時 ~ 16日 06時)
 天氣 ==> 晴時多雲
 溫度 ==> 23° ~ 28°
 降雨率 ==> 10%
舒適度 ==> 舒適

          明天白天  (16日 06時 ~ 16日 18時)
 天氣 ==> 多雲時晴
 溫度 ==> 23° ~ 31°
 降雨率 ==> 10%
舒適度 ==> 舒適至悶熱


基隆市

          今天白天  (15日 06時 ~ 15日 18時)
 天氣 ==> 陰短暫雨
 溫度 ==> 22° ~ 25°
 降雨率 ==> 70%
舒適度 ==> 舒適

          今晚明晨  (15日 18時 ~ 16日 06時)
 天氣 ==> 陰短暫雨
 溫度 ==> 22° ~ 23°
 降雨率 ==> 40%
舒適度 ==> 舒適

          明天白天  (16日 06時 ~ 16日 18時)
 天氣 ==> 陰時多雲短暫雨
 溫度 ==> 22° ~ 25°
 降雨率 ==> 70%
舒適度 ==> 舒適


澎湖縣

          今天白天  (15日 06時 ~ 15日 18時)
 天氣 ==> 多雲
 溫度 ==> 24° ~ 29°
 降雨率 ==> 0%
舒適度 ==> 舒適

          今晚明晨  (15日 18時 ~ 16日 06時)
 天氣 ==> 多雲短暫雨
 溫度 ==> 24° ~ 25°
 降雨率 ==> 30%
舒適度 ==> 舒適

          明天白天  (16日 06時 ~ 16日 18時)
 天氣 ==> 多雲
 溫度 ==> 24° ~ 27°
 降雨率 ==> 10%
舒適度 ==> 舒適


彰化縣

          今天白天  (15日 06時 ~ 15日 18時)
 天氣 ==> 多雲時晴
 溫度 ==> 23° ~ 31°
 降雨率 ==> 10%
舒適度 ==> 舒適至悶熱

          今晚明晨  (15日 18時 ~ 16日 06時)
 天氣 ==> 多雲時晴
 溫度 ==> 23° ~ 27°
 降雨率 ==> 10%
舒適度 ==> 舒適

          明天白天  (16日 06時 ~ 16日 18時)
 天氣 ==> 多雲
 溫度 ==> 23° ~ 29°
 降雨率 ==> 10%
舒適度 ==> 舒適


連江縣

          今天白天  (15日 06時 ~ 15日 18時)
 天氣 ==> 陰短暫雨
 溫度 ==> 20° ~ 23°
 降雨率 ==> 50%
舒適度 ==> 稍有寒意至舒適

          今晚明晨  (15日 18時 ~ 16日 06時)
 天氣 ==> 陰時多雲短暫雨
 溫度 ==> 20° ~ 21°
 降雨率 ==> 60%
舒適度 ==> 舒適

          明天白天  (16日 06時 ~ 16日 18時)
 天氣 ==> 多雲時陰短暫雨
 溫度 ==> 20° ~ 25°
 降雨率 ==> 30%
舒適度 ==> 舒適
























留言

這個網誌中的熱門文章

【研究】列印的條碼為什麼很難刷(掃描)

C# 使用 Process.Start 執行外部程式

統一發票列印小程式