现在是网络的时代,也是移动的时代,网络和移动的结合更是趋势。由此诞生了不少的移动网络应用,从以前较为简单的WAP手机应用发展到如今的各类富互联网应用,更多许多优秀的移动应用客户端,诸如微博、QQ等客户端更是移动用户的必装软件,他们的共同点就是与网络打交道。在Windows Phone 开发中,有以下几种经常使用的方式进行网络交互。【下述代码点击这里下载】php
通常的代码格式以下:算法
申明一个WebClient实例,注册该实例的DownloadStringCompleted事件,而后发起异步请求便可。下面以博客园的订阅博客为例讲解如何在Windows Phone 中使用WebClient。 api
下图是运行后的效果图,咱们输入博主的名称,如alexis,点击"Get Blogs",查出的结果就是该博主近期的博客的订阅 浏览器
点击按钮的处理代码以下 安全
其中第一行代码是用于在SystemTray上显示当前信息,这在之前的博客中已说起。下面来看看注册的client_DownloadStringCompleted事件 服务器
在讲解上述代码以前,咱们先来看看咱们下载的数据源是什么样的,使用谷歌浏览器打开http://www.cnblogs.com/alexis/rss 就能看到数据源是基于XML格式的,由一个个item组成 网络
这里是使用XML TO LINQ实现的,首先将下载下来得字符串转换为XML中的XElment,而后使用Linq将咱们所须要的值的集合找出来,最后将集合做为ListBox的数据源以进行显示,RssItem的定义以下: app
上一节中讲解了WebClient的简单用法,WebClient是请求远程资源的最简单的方法,它其实是对HttpWebRequest的进一步封装,隐藏了请求中的一些细节,而HttpWebRequest则可让你了解请求的过程。 异步
使用HttpWebRequest进行HTTP请求的步骤以下:
1. 建立HttpWebRequest的一个实例
2. 对请求流写入一些东西(如文件)若是你须要的话
3. 得到响应
4. 读取返回流中的数据
5. 关闭流 ide
那么上述得到博客的例子能够利用HttpWebRequest重写以下:
对于REST服务请求的封装,第三方类库中Hammock以及RESTSharp都作得很好,我这里采用的是Hammock。咱们这里只讲解Hammock的简单用法:
更多的能够参考源代码
咱们查看微盘的API文档,发现提供了许多类型的请求,分别对应不一样类型的操做。为了开发时和后期维护方便,我定义了一个枚举类型的服务类型,便于标识区分这些服务:
如上所述,使用REST服务的步骤就是发起一个请求,设置一些请求参数,而后坐等异步的回调,在回调中得到服务器返回的数据,从而进行处理。
获取token与其余全部的请求不同,他是全部其余请求的先决条件,咱们只有获取到Token后才能发起其余请求:
这里咱们须要传入咱们应用的AppKey还有当前的时间戳,如下方法是在Windows Phone 中获取当前时间戳的方法:
另外,你们是否注意到,咱们这里须要传入一个签名signature,你们应该都知道通常都是用签名来提升数据传输的安全性。由于token是十分 机密的数据,若是让别人截获了token,他就能够对你的微盘进行任何操做。咱们来看看API文档中是如何定义须要传入的signature的:
signature: 动态签名, hmac_sha256("account=相应的值&appkey=相应的值&password=相应的值&time=相应的值", app_secret)
对应的PHP实例: $signature = hash_hmac('sha256', "account={$account}&appkey={$appkey}&password={$password}&time={$time}", $app_secret, false);
有一个相应的算法,由于API网站中给出的是php的调用方法,hash_hmac是php中的一个函数,那么C#中有没有与之对应的函数呢?下面是获取签名的方法。
须要注意的是:
有了请求,咱们只须要BeginRequest就能够得到相应的Response:
其中:
restClient是RestClient类的实例
Constants.ApiUrl为微盘的API地址
AsyncCallback为异步回调接收响应的函数,注意到咱们这里传入了一个服务类型为ServiceType.GetToken,这样作的好处是咱们可使用一个单独的回调函数进行处理,而不要每个请求对应一个回调函数。
上图是AsyncCallback的签名。下面来看看如何处理得到token
使用switch对请求类型以进行区分对待。咱们使用Newtonsoft.Json中提供的JsonConvert对返回的数据进行序列化
其中,TokenResponse的定义以下
咱们须要将得到的token和dologid保存,用于下次请求。 有了Token之后,咱们才能够进行下面的请求。
Note:空闲时(不作任何操做, 15分钟后)token会失效
微盘API中通常的请求都是路径和参数不同的,为了方便管理,我这里新建了一个获取特定请求的帮助类,以下图是获取上传文件的请求:
其中UploadFileReq是封装的请求类,里面是一些传入请求中的参数,其定义以下图:
同获取Token的方法同样,咱们只须要BeginRequest一下便可
注意要加上相应的服务类型ServiceType.UploadFile
其余的请求服务封装同上传文件,这里就很少说了,详细的能够查看源代码。
封装接口后,咱们须要对外面提供相应的接口,以方便Windows Phone 应用程序调用封装的类库。
微盘全部的接口都是基于登陆后得到的Token才能请求成功的,因此首先咱们须要提供的就是登陆的接口。查看API文档知道,调用登陆接口(即获取 Token)须要的参数值有以下几个:帐号、密码、AppKey以及AppSecret。做为一个通用的SDK类库,咱们须要提供接口让调用者设置一些相 应的初始值,如AppKey、AppSecret。
我是提供了一个public的属性给外界,以下图
你们是否注意到,对应请求的回调函数,我是统一用一个函数进行处理,以ServiceType进行区分判断,那么怎么将这个回调函数公布呢?这里我使用的一个委托,并定义一个该类型的公共属性,把这个公共属性做为对外的接口:
在回调中函数调用该属性
这样咱们在Windows Phone程序中注册该委托就能够获得回调函数中的数据了。
咱们封装好REST服务后,就能够在咱们的Windows Phone应用程序中使用了。具体的方法以下:
由于基本上全部的API都是须要Token的,因此获取Token确定是第一步,即调用SDK的获取Token方法:
其中,
Constants.AppKey即咱们在微盘网站上申请的应用的AppKey
Constants.AppSecret即对应的AppSecret
而后就是调用服务的获取Token方法,须要传入用户名与密码。
你们是否注意到,咱们给NetService实例的ServicecallBack属性赋值为登陆回调函数:
因为登陆有可能失败,因此咱们也须要处理失败的状况。Note:若是是跨线程调用,则咱们须要将改变UI线程的代码放在Deployment.Current.Dispatcher.BeginInvoke中。
下面来说如何上传文件到微盘的接口,做为示例,咱们将输入文本框的文字保存为文本文件上传到微盘中,页面的大体效果图以下
由于只有登陆后才能上传文件,因此先讲Upload按钮设为不可用。
登陆代码上面已经给出,咱们在点击Upload按钮的时候须要作以下两件事情:
下述代码是建立一个文本,其中fileName为字符串常量
而后来看下按钮事件:
首先进行输入框中是否有输入,若是没有弹出提示框。而后在独立存储空间生成文本文件,最后就是调用微盘SDK的上传方法,输入相应的参数,指定回调函数
点击Upload,等了一会若是弹出提示"upload file succeed"的话,那么恭喜你,文件上传成功后,咱们能够登陆微盘check一下:
能够检查一下上传时间是否是如今的时间,固然你也能够重命名文件名。
微盘中可能有个别接口没有实现,若是有兴趣贡献代码的能够跟我联系 。
微盘SDK for Windows Phone的源代码能够在vdisk.codeplex.com 上找到,谢谢你的支持