WP7 SkyDrive API 调用
SkyDriveAPI是微软Windows Live免费服务公开的API的一部分,Live服务包括:MSN个人信息、Hotmail、日历、联系人、SkyDrive、Messager几部分,使用方法大概相似,都是先要登陆授权,然后用授权得到的凭证使用API操作服务。
因本人用到SkyDrive,现着重介绍SkyDrive.
这是学习开始页面,所有的信息都可以从在这里获取,当然这里的信息量比较大
SkyDrive的调用方法有很多,如果你用C#,那么你有福了,MS的大集成战略让你可以用现成的SDK,而且现在又有SDK 5.1Preview,可以使用async和await~~~如果您用其他方式,可以通过OAuth 2.0, JavaScript Object Notation (JSON), and Extensible Messaging and Presence Protocol (XMPP),具体的实现方式,可以看这些Sample 。这里就不一一详细说了,只说一下WP7平台下的粗略使用。
先推荐几个资源
SDK在线测试工具:http://isdk.dev.live.com/ISDK.aspx
一步步开始En版:http://msdn.microsoft.com/en-us/windowslive/ff621314
API类库文档:http://msdn.microsoft.com/library/hh243650.aspx
在继续往下了解之前,我想先弄明白几个概念
什么是REST表述性状态转移(Representational State Transfer)?
REST的概念始于2000年,可以看这个《架构风格与基于网络的软件架构设计》,推荐阅读第五章,简单点,也可以看百度百科,我理解就是将请求的操作资源化,Get,Login等操作都是对某一个资源的操作,而操作资源的方式就是GET http或者POST http,当然 还有其他的。这些请求没有返回的状态,不是事件驱动的,不会像WCF的svc这种服务文件一样,你请求的时候会有Complete事件中而且有一个返回的e.Result。REST的好处能 减轻服务器的压力,因为不需要服务器返回状态,部署的资源通过URI链接都可被访问和操作,有利于服务间的互操作。
通过这个概念的了解我们就可以更容易的理解REST API了,以File object为例子
获取File属性的GET URI为:https://apis.live.net/v5.0/me/FILE_ID?access_token=ACCESS_TOKEN
获取File内容的GET URI为:https://apis.live.net/v5.0/me/FILE_ID/content?access_token=ACCESS_TOKEN
上传File的PUT URI为:
https://apis.live.net/v5.0/me//FOLDER_ID/files/file1.txt/content?access_token=ACCESS_TOKEN
但是在用PUT方法的时候要将
Content-Type: multipart/form-data; boundary=AaB03x
Content-Disposition: file; filename="file1.txt"
写上。
什么是Scopes在使用API之前,你需要对所做的操作获取权限,形式如下:
JavaScript:
WL.login(
{ "scope": "wl.skydrive" },
function (response) {
if (response.status == "connected") {
getFiles();
}
else {
log("Could not connect, status = " + response.status);
}
});
C#:
<live:SignInButton ClientId="000000004C091545" Scopes="wl.signin wl.skydrive"/>
OAuth 2.0:
the response for the HTTP POST request如果成功,会返回
{
"access_token": "EwCo...//access token string shortened for brevity//...AA==",
"expires_in": 3600,
"scope": "wl.signin wl.basic",
"token_type": "bearer"
}
其实理解了这几个概念剩下的就好说了
访问API必备的条件,
1、操作方式:me/FILE_ID,你要做什么样的操作
2、ClientId:000000004C091545,你应用的客户ID
3、Scopes:wl.signin wl.skydrive你所操作的权限
有了2、3要素,就可以切换到请求登录页面获取第4个要素
4、Token或者Session
有了4 要素,结合不同的1要素就可以访问Live的各种API了
首先为了取到ClientID,要注册授权应用
https://manage.dev.live.com/Applications/Index
可在此处注册你的授权应用
剩下的步骤就代码吧
1、前台的登录按钮
<live:SignInButton x:Name="skyLogin" ClientId="000000004C091545" Scopes="wl.signin wl.basic wl.skydrive" Branding="Skydrive" TextType="SignIn" SessionChanged="SignInButton_SessionChanged"
/>
2、对应的后台事件
//登陆
private LiveConnectClient client; private void SignInButton_SessionChanged(object sender, LiveConnectSessionChangedEventArgs e) { if (e.Status == LiveConnectSessionStatus.Connected) { client = new LiveConnectClient(e.Session); } }通过这两步,取到了
LiveConnectClient client
3、获取SkyDrive的文件信息:
client.GetAsync("me/skydrive/files") client.GetCompleted +=new EventHandler<LiveOperationCompletedEventArgs>(getFolderProperties_Completed); //将文件树信息用ListBox展示 void getFolderProperties_Completed(object sender, LiveOperationCompletedEventArgs e) { if (e.Error == null) { IDictionary<string, object> result = e.Result; var data = result["data"]; var folders = data as List<object>; var folderSource = new ObservableCollection<FolderFile>(); for (int i = 0; i < folders.Count; i++) { folderSource.Add(new FolderFile() { ID = (folders[i] as IDictionary<string, object>)["id"].ToString(), Name = (folders[i] as IDictionary<string, object>)["name"].ToString(), Type = (folders[i] as IDictionary<string, object>)["type"].ToString(), ParentID = (folders[i] as IDictionary<string, object>)["parent_id"].ToString() }); } lstFiles.ItemsSource = folderSource.Where(p => p.Type == "folder" || p.Type == "file"); } else { MessageBox.Show(e.Error.Message); } }当然也可以通过其他的方式获取,这里就不一一列举了。写的有什么不对的地方,希望能与大家交流,欢迎拍砖。