UWPアプリケーションからOneDriveを簡単に操作する方法







XAML / C#UWPアプリケーションの世界からの興味深い/有用なことについて話し続けます。 OneDrive APIはMicrosoft Graphの一部です。 OneDriveを使用するには、HTTPプロトコル、特にそのメソッドGET、POST、DELETE、PUTを使用するOneDrive REST APIを使用できます。



さらに、Microsoftの新しい原則に従って、CSharpラッパーライブラリOneDrive SDKが作成されました。これにより、アプリケーションのコードからのサービスの使用と使用が容易になります。



OneDrive SDK for CSharpは、以下のタイプのプロジェクト向けに設計されたポータブルクラスライブラリ(PCL)です。



.NET 4.5.1

.NET for Windowsストアアプリ

Windows Phone 8.1以降



SDKをインストールするには、 NuGetパッケージマネージャーのコンソールでコマンドを実行できます。



Install-Package Microsoft.OneDriveSDK
      
      





または、NuGet VSマネージャーで、 Microsoft.OneDriveSDKフレーズ検索を使用します



ユニバーサルアプリケーションを作成したら、Windowsストアに関連付ける必要があります。 したがって、Live SDKアプリケーショングループに自動的に登録されます。 https://apps.dev.microsoft.com/#/appListで 、アプリケーションがLive SDKアプリケーショングループに登録されていることを確認できます。 私の理解では、すべてのWindowsストアアプリはデフォルトでこのグループに分類されます。



認証は数行のコードで行われます:



  string[] scopes = { "wl.signin", "onedrive.readwrite" }; IOneDriveClient _client = OneDriveClientExtensions.GetClientUsingOnlineIdAuthenticator(scopes); await _client.AuthenticateAsync();
      
      





すべての権利/許可(スコープ)は、 認証スコープで利用できます。



認証中に、ユーザーがデータを入力できる新しいウィンドウが開きます。







次のコードを使用して終了できます。



 await _client.SignOutAsync();
      
      





最も典型的なファイル操作を説明します。 このスニペットを使用してファイルをダウンロードできます。



  string[] scopes = { "wl.signin", "onedrive.readwrite" }; IOneDriveClient _client = OneDriveClientExtensions.GetClientUsingOnlineIdAuthenticator(scopes); AccountSession session = await _client.AuthenticateAsync(); if (!_client.IsAuthenticated) return; Item item = await _client .Drive .Root .ItemWithPath("CodeExamples/MyDemo.zip") .Request() .GetAsync(); using (Stream contentStream = await _client .Drive .Items[item.Id] .Content .Request() .GetAsync()) { StorageFile file = await ApplicationData.Current.LocalFolder. CreateFileAsync("MyDemo.zip", CreationCollisionOption.OpenIfExists); using (Stream outputstream = await file.OpenStreamForWriteAsync()) { await contentStream.CopyToAsync(outputstream); } }
      
      





これを使用してダウンロードします。



 string[] scopes = { "wl.signin", "onedrive.readwrite" }; IOneDriveClient _client = OneDriveClientExtensions.GetClientUsingOnlineIdAuthenticator(scopes); AccountSession acse = await _client.AuthenticateAsync(); if (!_client.IsAuthenticated) return; FileOpenPicker fileOpenPicker = new FileOpenPicker(); fileOpenPicker.FileTypeFilter.Add(".jpg"); StorageFile file = await fileOpenPicker.PickSingleFileAsync(); if (file != null) { using (Stream contentStream = await file.OpenStreamForReadAsync()) { var uploadedItem = await _client .Drive .Root .ItemWithPath("CodeExamples/" + file.Name) .Content .Request() .PutAsync<Item>(contentStream); } }
      
      





他のファイル操作の説明は、GitHubリンクで入手できます。OneDriveSDK for Cのアイテム#



ただし、この方法では、ルートフォルダー内のアイテムのリストを取得できます。



  IChildrenCollectionPage ic= await _client .Drive .Root .Children .Request() .GetAsync();
      
      





次に、同じ操作を少し見てみましょうが、すでにREST APIを使用しています。 これを行うには、アクティブセッションのオブジェクトであるAccountSessionから取得できるアクセストークンが必要です(OneDrive SDKの機能を使用して、REST APIでの作業を簡素化します)。 また、System.Net.HttpスペースのHttpClientクラスも必要です。



  Uri uri = new Uri("https://api.onedrive.com/v1.0/drive/root/children"); HttpClient client = new HttpClient(); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", session.AccessToken); string jsonstring = await client.GetStringAsync(uri);
      
      





その結果、ルートフォルダー内のOneDriveにあるすべてのアイテムをリストするJSON形式の文字列を取得します。

ストアにアプリケーションを登録することはできませんが、実験のために一時的なアクセストークン(1時間有効)を取得します。 これを行うには、 OneDriveの認証とサインインページで、[トークンの取得]ボタンをクリックします。



最初の方法は明らかに単純で短いですが、2番目の方法も有用です。 次のようなファイルへのリンクを取得できるとします。



  Uri uri = new Uri("https://api.onedrive.com/v1.0/drive/root:/CodeExamples/MyDemo.zip:/action.createLink"); HttpClient client = new HttpClient(); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", session.AccessToken); var requestJson = JsonConvert.SerializeObject( new RequestLinkInfo { type = "view" }); var content = new StringContent(requestJson,Encoding.UTF8,"application/json"); var response = await client.PostAsync(uri,content); LinkResponseInfo result = JsonConvert.DeserializeObject<LinkResponseInfo>( await response.Content.ReadAsStringAsync());
      
      





コンテンツを見ると、ファイルへのパスがUri行のコロンで囲まれていることがわかります。 または、ファイルのID /drive/items/{item-idasket/action.createLinkを使用できます。



JSONをシリアライズおよびデシリアライズするには、次のクラスが必要です。



  public class RequestLinkInfo { public string type { get; set; } //  : view, edit  embed public string scope { get; set; } // optional -  : anonymous  organization } public class LinkResponseInfo { public string id { get; set; } public string[] roles { get; set; } public Link link { get; set; } } public class Link { public string type { get; set; } public string scope { get; set; } public string webUrl { get; set; } public OneDriveApplication application { get; set; } } public class OneDriveApplication { public string id { get; set; } public string displayName { get; set; } }
      
      





URL自体は、結果オブジェクトから取得できます。



  string fileurl = result.link.webUrl;
      
      





興味深いのは、古いLive APIを使用して、ログインしたユーザーに関する情報にアクセスできることです。



  Uri uri = new Uri("https://apis.live.net/v5.0/me"); HttpClient client = new HttpClient(); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", session.AccessToken); string jsonstring = await client.GetStringAsync(uri);
      
      





ただし、Live APIがいつまで利用可能になるかを言うのは困難です。

ホワイトペーパーはこちらから入手できます: OneDrive APIを使用して開発する



All Articles