WindowsPhone天气预报小程序+中国天气网API+新浪天气API

环境描述:Windows7+VisualStudio2010+真机(HTC c110e Radar)+中国移动SIM卡+中国天气网API。开发自用的天气预报小程序。

大概有三种接口吧,以北京为例:
接口地址:
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

其中:101010100代表的是北京在中国天气网的数据库中的编码。中国各个城市代码及详细API开发请参考:http://blog.csdn.net/grassroots2011/article/details/8548021     本文旨在记录我在开发途中遇到的各种问题。

问题描述1:WindowsPhone7开发跟网络相关的API中有个WebRequest抽象类,此类提供了两个静态方法(WebRequest.Create(.......)和WebRequest.CreateHttp(......))用去创建网络请求。

这两个方法的原型及其重载方法如下四个:

public abstract class WebRequest
{

  public static WebRequest Create(string requestUriString);
  public static WebRequest Create(Uri requestUri);
  public static HttpWebRequest CreateHttp(string requestUriString);
  public static HttpWebRequest CreateHttp(Uri requestUri);

  and so on......

}

在早先的程序开发当中用的都是Create()方法,这次刚打出Create,VisualStudio2010的只能提示就把CreateHttp()方法也列出来了。 看了一下方法描述和返回值,HttpWebRequest类是WebRequest类的具体派生类。所以这次就直接用上了CreateHttp()方法。之后程序总是获取不到天气信息,各种出错,从WebResponse响应类GetResponseStream()中得到的Stream的Length是4294967295,查了下System.Int32.MaxValue的值为2147483647,*2+1刚好就等于4294967295。。。我不知道为啥Stream.Length的默认初始长度是为System.Uint32的最大值。

之后费了半天才发现问题出在WebRequest.CreateHttp()方法上,改为WebRequest.CreateHttp()后,程序完全运行正常了。google了一下WebRequest.Create()和WebRequest.CreateHttp()的主要区别之一是:Creattehttp()是不上传Cookie的,但是本身中国天气网的API就只需要客户端一个URL地址就可以了,完全不需要用cookie。况且直接在PC浏览器上禁用Cookie,还是能正常获取到天气信息。另外一个区别就是windows验证和Forms验证。估计就是这个问题了吧。

问题描述2:中国天气网API返回的是Json数据。windowsPhone7上官方类库提供的API有点问题,我就没用了。用的是第三方Json类库Newtonsoft.Json.WindowsPhone.dll。其中最强大的一个类:JObject,所有的string json串都可以通过一个静态方法转化成json对象,然后进行Linq to Json操作。用法是 使用JObject类的静态方法public static JObject Parse(string json);  注意千万别用JObject类的构造函数传递json字符串来创建JObject对象,其实那个构造函数的参数类型是Object,因为Object是所有类的基类,任何类型都能传递进去。我就是在这个地方耗费了好长时间。

问题描述3:中国天气网提供的三个API,我用到的是第一个和第三个。第一个貌似是实时信息,数据量小;第三个是现在及其未来5天的天气信息,数据量大。但是很遗憾,中国移动貌似屏蔽了m.weather.com.cn的ip地址,导致咱们在用GPRS访问第三个接口总是失败。。。试了各种办法:开始以为是屏蔽了域名,我就直接嵌入Ping得到IP地址而不使用m.weather.com.cn。但是还是行不通。最后只能设置在GPRS通道下不访问第三个接口。今天查了下其他的天气预报API。新浪天气API做得挺详细,http://blog.csdn.net/l_ch_g/article/details/8205817 用Chrome的开发人员工具看了下,访问一次就大约要耗费1K的数据,如何还要访问未来5天的数据,那就总共大约要耗费6K的数据流量,真是浪费。我想大部分人对天气预报的需求也就集中在看下当前温度、当前天气状况、及其未来几天的天气状况及温度范围。。至于什么防晒指数、洗车指数、紫外线指数  及其它们的描述 我想对大部分人来说都是鸡肋。。。所以还是算了吧,本来还想弄个后台两个小时访问一下温度实时信息,Pin to Star 的。

原文地址:https://www.cnblogs.com/605395451/p/3000982.html