云服务在当今时代已经成为人们生活中不可或缺的一部分。它简单快捷,能够让人们轻松地加入到流行的云服务群体中。不同的云服务提供商通常会在其文档页面上提供大量的信息,并且由于云服务的分布式特性,它们通常会指定一个自定义的REST风格API。这种规范足够让理解服务提供商所提供的众多特性,但并没有让更接近于使用常规的开发工具和现代编程语言进行实际实现。
RestSharpSDK提供了许多已经实现的特性,比如OAuthv1和OAuth v2协议、REST协议等,甚至为提供了一种使用RestSharp SDK的原生风格。在开始学习和使用应用程序之前,请确保已经完成了以下步骤:注册Box.com并创建一个Box.com应用程序(即获取App key/App secret对)。可以在Box.com开发资源阅读解释这些简单步骤的说明。
将获得的App key/App secret对放入下面的常量字符串中。这是一个重要的步骤,它是唯一需要贡献代码片段以使其实际有效的部分。
private const string mc_apiKey = "YOUR_API_KEY";
private const string mc_appsecret = "YOUR_APP_SECRET";
这一步对应于Authorize操作:
var baseUrl = "https://www.box.com";
var client = new RestClient(baseUrl);
string sAuthorizationCallBackURL = string.Format(sLoopbackCallback, auth_GetRandomUnusedPort(), Assembly.GetEntryAssembly().GetName().Name);
var request = new RestRequest(string.Format("/api/oauth2/authorize?response_type=code&client_id={0}&state=authenticated&redirect_uri={1}", mc_apiKey, sAuthorizationCallBackURL), Method.POST);
bool bHasUserGrantedAccess = false;
var url = client.BuildUri(request).ToString();
设置一个本地HTTP服务器以接受认证回调:
string auth_code = null;
var resetEvent = new ManualResetEvent(false);
using (var svr = SimpleServer.Create(sAuthorizationCallBackURL, context => {
var qs = HttpUtility.ParseQueryString(context.Request.RawUrl);
auth_code = qs["code"];
if (!string.IsNullOrEmpty(auth_code)) {
bHasUserGrantedAccess = true;
resetEvent.Set();
}
}))
{
System.Diagnostics.Process.Start(url);
resetEvent.WaitOne();
}
if (false == bHasUserGrantedAccess) {
break;
}
string authorizationCode = auth_code;
这一步对应于Token操作:
request = new RestRequest("/api/oauth2/token", Method.POST);
request.AddParameter("grant_type", "authorization_code");
request.AddParameter("code", authorizationCode);
request.AddParameter("client_id", mc_apiKey);
request.AddParameter("client_secret", mc_appsecret);
var response = client.Execute(request);
if (response.StatusCode != System.Net.HttpStatusCode.OK) {
break;
}
accessToken = response.Data;
if (string.IsNullOrEmpty(accessToken.access_token) || string.IsNullOrEmpty(accessToken.refresh_token) || (0 == accessToken.expires_in)) {
break;
}
这一步对应于Token操作:
#if USE_REFRESH_TOKEN
request = new RestRequest("/api/oauth2/token", Method.POST);
request.AddParameter("grant_type", "refresh_token");
request.AddParameter("code", accessToken.access_token);
request.AddParameter("client_id", mc_apiKey);
request.AddParameter("client_secret", mc_appsecret);
request.AddParameter("refresh_token", accessToken.refresh_token);
response = client.Execute(request);
if (response.StatusCode != System.Net.HttpStatusCode.OK) {
break;
}
accessToken = response.Data;
if (string.IsNullOrEmpty(accessToken.access_token) || string.IsNullOrEmpty(accessToken.refresh_token) || (0 == accessToken.expires_in)) {
break;
}
#endif // USE_REFRESH_TOKEN
这一步对应于获取当前用户信息的操作:
baseUrl = "https://api.box.com";
client = new RestClient(baseUrl);
request = new RestRequest(string.Format("/{0}/users/me", mc_version), Method.GET);
request.AddParameter("Authorization", string.Format("Bearer {0}", accessToken.access_token), ParameterType.HttpHeader);
var responseAccountInfo = client.Execute(request);
if (responseAccountInfo.StatusCode != System.Net.HttpStatusCode.OK) {
break;
}
AccountInfo accountInfo = responseAccountInfo.Data;
Console.WriteLine("Got access to the \"{0}\" account with ID=\"{1}\" and \"{2}\" e-mail.", accountInfo.name, accountInfo.id, accountInfo.login);
本文的主要目的是为C#开发者提供一个完整的参考应用程序,以加快了解其工作原理、从何开始以及如何使其工作的过程。希望小小贡献能够帮助到正在寻找此类帮助的其他开发者。