前言:获取天气接口数据,需要用一些知识点,比如解析xml,Json数据转换成我们需要的对象,由于之前没有在项目用过。有做成一个小Demo分享下,同时也是让自己学习下。相关接口介绍可以参考课后网的谢周兵的文章:中国天气网接口返回json格式分析及接口(XML、图片接口)说明!
首先,我们要做的是确定要取数据的城市,当然可以从全国开始,本文的示例仅限在福建省内,根据城市的中文拼音获取相关城市的天气数据。可以创建一个天气处理类WeatherHandler.cs。去中国天气网获取福建的市xml文件URL地址:http://flash.weather.com.cn/wmaps/xml/fujian.xml,获取返回城市的URL代码-用于取天气数据。方法如下:
1 /// <summary> 2 /// 获取城市Url代码 - 用于构建请求天气信息的Url地址 3 /// 目前只支持福建省下级城市 4 /// </summary> 5 /// <param name="cityName">城市名称-拼音 如:xiamen</param> 6 /// <returns></returns> 7 public static string GetCityCode(string cityName) 8 { 9 // 去中国天气网获取福建的市xml文件 10 string provinceUrl = "http://flash.weather.com.cn/wmaps/xml/fujian.xml"; 11 12 // 解析加载回来的xml文件 13 XmlDocument doc = new XmlDocument(); 14 doc.Load(new XmlTextReader(provinceUrl)); 15 16 // 返回城市Url代码 - 用于取天气数据 17 string cityCode = null; 18 19 if (doc.HasChildNodes) 20 { 21 foreach (XmlNode pNode in doc.ChildNodes) 22 { 23 if (pNode.HasChildNodes) 24 { 25 foreach (XmlNode cNode in pNode.ChildNodes) 26 { 27 if (cNode.Attributes["pyName"].Value == cityName) 28 { 29 cityCode = cNode.Attributes["url"].Value; 30 break; // 跳出循环 31 } 32 } 33 } 34 } 35 } 36 37 return cityCode; 38 }
第二,根据城市名称(如:xiamen)返回天气类信息,用第一步的方法获取对应返回城市Url代码(如:101230201),构建请求访问天气详细信息的Url地址(如:http://m.weather.com.cn/data/101230201.html),可以得到从中国天气网返回的json数据,我们根据需要返回的结果创建对应的对象WeatherJson,再通过反系列化成自定义好的对象WeatherJson,这样就可以通过对象的方式访问对的数据了。为了让代码复用性更高些,请求发送数据也独立成一个方法。参考代码如下:
1 /// <summary> 2 /// 发送请求返回响应的数据 3 /// </summary> 4 /// <param name="url">请求的Url地址</param> 5 /// <returns></returns> 6 public static string GetRequestData(string url) 7 { 8 // 构建一个请求 9 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 10 // 请求的方式 11 request.Method = "GET"; 12 13 // 请求的响应 14 HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 15 16 // 响应的流 17 Stream responseStream = response.GetResponseStream(); 18 19 // 字符编码 20 Encoding enc = Encoding.GetEncoding("utf-8"); 21 22 // 读取流 23 StreamReader readResponseStream = new StreamReader(responseStream, enc); 24 25 // 请求的结果 26 string result = readResponseStream.ReadToEnd(); 27 28 // 关闭流,响应,释放资源 29 readResponseStream.Close(); 30 response.Close(); 31 32 return result; 33 34 } 35 36 /// <summary> 37 /// 根据城市名称返回天气类信息 38 /// 目录只支持福建省下级城市 39 /// </summary> 40 /// <param name="cityName">城市名称-拼音 如:xiamen</param> 41 /// <returns></returns> 42 public static WeatherInfo GetWeatherInfo(string cityName) 43 { 44 // 填充相关的WeatherInfo数据 45 WeatherInfo wInfo = null; 46 47 try 48 { 49 // 城市Url代码 50 string cityCode = GetCityCode(cityName); 51 52 // 访问天气详细信息的Url地址 53 string weatherUrl = "http://m.weather.com.cn/data/" + cityCode + ".html"; 54 55 // 从中国天气网返回的json数据 56 string jsonData = GetRequestData(weatherUrl); 57 58 // 根据返回的Json数据反系列化自定义好的对象 59 WeatherJson json = JsonSerializerHelper.FromJsonTo<WeatherJson>(jsonData); 60 61 // 填充相关的WeatherInfo数据 62 wInfo = json.WeatherInfo; 63 } 64 catch (Exception) 65 { 66 } 67 68 return wInfo; 69 70 }
第三,就可以调用转换好的对象进行使用了,比如我在控制台输出我想要的数据。
1 // 确定要取的城市名称 - 拼音 2 string cityName = "xiamen"; 3 4 5 WeatherInfo weatherInfo = WeatherHandler.GetWeatherInfo(cityName); 6 7 Console.WriteLine("weatherInfo.City:" + weatherInfo.City); 8 Console.WriteLine("weatherInfo.CityEn:" + weatherInfo.CityEn); 9 Console.WriteLine("weatherInfo.CityId:" + weatherInfo.CityId); 10 Console.WriteLine("weatherInfo.DateY:" + weatherInfo.DateY); 11 Console.WriteLine("weatherInfo.FutureTemperature:" + weatherInfo.FutureTemperature); 12 Console.WriteLine("weatherInfo.TodayTemperature:" + weatherInfo.TodayTemperature); 13 Console.WriteLine("weatherInfo.TomorrowTemperature:" + weatherInfo.TomorrowTemperature); 14 Console.WriteLine("weatherInfo.Week:" + weatherInfo.Week); 15 16 Console.ReadLine();
效果图片:
最后,关于Json数据转换,我参考博客园作者“颓废”的博文Json序列化和反序列化方法实现的,这边代码就不帖出来了。需要了解的同学可以到相关博客去了解!项目Demo