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を使用して開発する

Source: https://habr.com/ru/post/J307130/


All Articles