闲着无聊时写的一个调用天气 API 的小 Demo

时间:2023-03-08 18:36:56

分为两个部分——调用以及实现,并且由于不想折腾,直接使用了 Console 来调用。

通过firefox直接调用

闲着无聊时写的一个调用天气 API 的小 Demo

Main 入口,调用以及输出

调用部分没什么好说的,主要是针对 dynamic 类型的数据进行遍历输出。

using System;

namespace ConsoleWeather
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            var weather = Weather.GetWeather("杭州");
            foreach (var day in weather.data.forecast)
            {
                Console.WriteLine(day);
            }
            Console.ReadKey();
        }
    }
}

实现部分

  1. 构建 Http 协议进行 Get 请求
  2. 需要注意的一点是返回的数据经过了 gzip 压缩(加密)
  3. 于是用到了微软自带一个 GZipStream 的解压缩类
  4. 最后通过 Newtonsoft.Json 中的 JsonConvert.DeserializeObject 转为 dynamic 方便操作
using Newtonsoft.Json; //JsonConvert
using System.IO; //Stream、StreamReader
using System.IO.Compression; //GZipStream
using System.Net; //WebRequest、WebResponse

namespace ConsoleWeather
{
    public static class Weather
    {
        private const string Url = "http://wthrcdn.etouch.cn/weather_mini?city=";

        public static dynamic GetWeather(string city)
        {
            string url = Url + city;
            //Get
            WebRequest request = WebRequest.Create(url);
            WebResponse response = request.GetResponse();
            //Content-Encoding:gzip
            Stream stream = response.GetResponseStream();
            string json = Decompress(stream);
            return JsonConvert.DeserializeObject(json);
        }

        private static string Decompress(Stream stream)
        {
            GZipStream gZip = new GZipStream(stream, CompressionMode.Decompress);
            StreamReader sr = new StreamReader(gZip);
            return sr.ReadToEnd();
        }
    }
}