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:

https://oauth.live.com/authorize?client_id=0000000603DB0F&scope=wl.signin%20wl.basic&response_type=code&redirect_uri=http%3A%2F%2Fwww.contoso.com%2Fcallback.php

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);
}
}
当然也可以通过其他的方式获取,这里就不一一列举了。写的有什么不对的地方,希望能与大家交流,欢迎拍砖。

posted @ 2012-03-31 21:07  Bryht  阅读(1696)  评论(0编辑  收藏  举报