2016 年 1 月

第 31 卷,第 1 期

本文章是由機器翻譯。

Windows 10 - 在 Windows 10 應用程式中使用 OneDrive REST API

Laurent Bugnion

在先前的架構,例如 Windows Phone 8、 OneDrive 小組提供的 SDK,是很方便使用,但沒有很多的自由讓開發人員。例如,登入機制只是可以使用內建的按鈕控制項,開發人員都無法變更外觀或行為。但最困難的部分就是這個預先定義的經驗,讓平台之間共用的程式碼。

現在,不過,OneDrive 小組提供現代的 REST API,根據 HTTP 要求 (GET、 POST、 PUT 等等)。這是有彈性的方式與巨大定域機組檔案儲存體進行互動,以及建置跨平台程式碼使用已知的程式碼共用可以執行所有 Windows 平台,並甚至在 iOS 和 Android 的 Xamarin 平台技術。

這個的兩篇文章的第一個會顯示如何運用新的 OneDrive API 來建置通用 Windows 平台 (UWP) 應用程式。首先,您將學習如何使用 REST API,以及開發人員應如何與它互動。您會看到使用者如何登入使用 oAuth 的系統,可利用檔案系統作業 (瀏覽資料夾、 取得檔案資訊、 取得檔案的內容上, 傳檔案,依此類推) 的方式。您也將學習如何執行其他作業,例如存取應用程式資料夾和與朋友共用項目的連結。

在下一步的文章中,我會討論有關 OneDrive 小組的新可攜式類別庫 (PCL),這封裝在好用的程式庫可加入至您的 UWP 應用程式,也會在其他支援的架構,例如 ASP.NET、 Xamarin.iOS、 Xamarin.Android 或 Xamarin.Forms 這裡所述的作業。

注意: 除了可以用在 Xamarin.Android 與 Xamarin.iOS 平台 PCL,OneDrive 小組也提供原生 Sdk 的兩個平台。

範例程式碼

您可以下載範例程式碼從 galasoft.ch/s/msdnonedrive。它會顯示簡單的 UWP 應用程式如何使用低階的 REST API,執行 OneDrive 的服務上的作業。若要示範的程式碼是容易移植,相同的應用程式也會實作 xamarin.android,和相同的原則可以套用至其他平台。

了解 REST API

REST Api 使用 HTTP 做為傳輸通訊協定,並依賴通訊協定的方法 (GET、 POST、 PUT、 DELETE 等等) 和標準錯誤代碼 (200 成功,400 不正確的要求、 500 伺服器錯誤等等)。每個 API 進入點是透過唯一的 URI,也可以有參數。在某些情況下,簡單的 GET 方法和查詢字串可用來將資訊傳送至服務並取得結果,但是,也可以藉由公佈某些物件序列化為 JSON 建置更複雜的要求。

REST Api 也變得越來越普遍,以及開發人員應該滿意為它提供非常清楚的方式來與 Web 服務通訊。最重要的是,它讓您能夠建置可攜式 C# 中的元件,並使用這些元件在所有支援的平台。HTTP 是以文字為基礎,而要求,可以輕鬆地透過防火牆和 proxy 進入另一個龐大的優勢。

不過,低層級的 HTTP 方法與通訊令人畏浩大的工程,尤其是對開發人員不習慣使用非同步程式設計的最新發展。建置使用回呼的非同步用戶端不穩的經驗,讓開發人員,因為深度巢狀和可能執行緒的問題時可能會發生。謝天謝地,兩個較新的開發時所做這更簡單 C# 程式設計人員: HttpClient 元件和非同步/等候關鍵字。比方說,存取 OneDrive 音樂資料夾變得簡單,只要建立 URI,然後傳送 GET 要求:

var uri = new Uri(
  "https://api.onedrive.com/v1.0/drive/special/music");
var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
  new AuthenticationHeaderValue("Bearer", AccessToken);
var json = await client.GetStringAsync(uri);

產生的 JSON 程式碼可以還原序列化 (使用 JSON.NET 程式庫,例如) 以取得應用程式中使用.NET 物件。此程式碼 (的確不需要登入或錯誤處理) 顯示方式會相當複雜的作業變得簡單且流暢。此外,此程式碼將完美上執行任何平台上支援 HttpClient,其中包括 Windows Presentation Foundation (WPF)、 ASP.NET、 Windows 10、 Xamarin 等等。

註冊您的應用程式

在進行 OneDrive API 的呼叫之前,必須在 OneDrive 開發人員中心中註冊您的應用程式、 設定和取得用戶端識別碼索引鍵。說明註冊機制 bit.ly/1GPBaWL

當您註冊新的應用程式時,請務必移至 [API 設定] 頁面,並將 「 行動或桌面用戶端應用程式 」 設定為 [是]。 所有其他設定可保留其預設值。然後,從應用程式設定] 頁面中,擷取用戶端識別碼,並儲存起來供稍後。

一定要了解不同的術語,需要哪些每個 ID:

  • 用戶端識別碼: 這是您的 UWP 應用程式的唯一識別碼。您可以有多個用戶端應用程式連接到使用相同的用戶端 ID、 Microsoft 服務,但通常建議使用每個應用程式的一個用戶端識別碼。用戶端識別碼會連結至 UWP 應用程式,例如其名稱、 圖示的資訊,依此類推。當應用程式已建立,且永遠不會變更,就會產生用戶端識別碼。
  • 用戶端密碼: 這是在建立 UWP 應用程式時產生的唯一識別碼。不過,此程式碼可能會變更應用程式的存留期間。例如,如果您認為,用戶端密碼已被駭,您可以產生新的一項,更新您的應用程式和駭客的應用程式將被拒絕存取。請注意用戶端密碼通常用於只伺服器應用程式。
  • 使用者識別碼和密碼: 當使用者登入時,系統會要求他輸入他的使用者名稱和密碼。由於 OAuth 登入互動發生使用者和 OneDrive 之間,用戶端應用程式不知情的情況下。實際上,這是使用登入對話方塊會顯示 web 檢視。
  • 存取權杖: 當使用者成功登入時,則驗證服務會傳回存取權杖。此權杖是有效的特定時間只能 (60 分鐘) 之後,使用者必須再次登入。權杖必須傳送每個要求,以證明使用者進行驗證。在這個驗證模式是名為語彙基元的非固定格式文件中。
  • 重新整理權杖: 這個語彙基元可由應用程式要求和儲存才能重新整理存取權杖,如果它已過期。如果您的應用程式在背景模式用於很長的時間,而且必須定期重新整理資料,而不需要使用者互動,這非常有用。在這個驗證模式為 [CodeFlow,描述在 bit.ly/1MQ3KOb。在本文中,我只會使用語彙基元的資料流程,這是容易實作。

項目嘗試與試用版的語彙基元

如果您想要快速嘗試幾個 REST 要求,但不會先實作驗證,OneDrive 開發人員中心可讓您取得試用版權杖,有效期為 1 小時,可依照下列步驟:

  • 移至 bit.ly/1MQ3KOb
  • 找出 「 立即試用 」 區段,然後按一下 [取得語彙基元的按鈕。
  • 如有需要請登入,並確認您授權存取您的 OneDrive 帳戶之開發人員中心。
  • 登入成功之後,試用版的語彙基元會出現在主視窗中,Web。
  • 建立新的 UWP 應用程式,名為 TrialOneDrive。
  • 開啟 MainPage.xaml,然後新增名為 TrialButton 的按鈕。
  • 開啟 MainPage.xaml.cs 並新增 TrialButton Click 事件的事件處理常式中的程式碼所示 [圖 1。請注意此事件處理常式必須使用"async"關鍵字,因為所有的 OneDrive 作業是非同步。
  • 程式碼中 [圖 1, ,將您試用 TOKEN 字串取代為您從開發人員中心網站中複製的試用版語彙基元。不要複製文字 」 授權: 持有者 」!
  • 將中斷點放在事件處理常式的最後一行中,為了檢查 JSON 變數。
  • 執行應用程式,然後按一下 [] 按鈕。
  • 檢查 [監看式視窗中的擷取的 JSON 程式碼。您可以查看您的音樂] 資料夾,例如其名稱、 建立日期、 上次修改的日期、 子系計數、 資料夾的識別碼 (可用於各種不同的檔案系統作業更新版本)、 登入的使用者名稱等資訊。

[圖 1 TrialButton Click 事件加入事件處理常式

TrialButton.Click += async (s, e) =>
{
  var uri = new Uri(
    "https://api.onedrive.com/v1.0/drive/special/music");
  var client = new HttpClient();
  client.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Bearer", "YOUR TRIAL TOKEN");
  var json = await client.GetStringAsync(uri);
};

請記得在試用版的權杖到期後一小時,因此取得新憑證,是否您想要示範此應用程式至您的老闆別忘了!

使用 OAuth 進行驗證

既然您已註冊的應用程式,並了解的重要詞彙,您可以實作驗證。若要這麼做,如下所示的步驟如下 [圖 2:

  1. 使用者起始驗證,例如按一下按鈕。
  2. 應用程式會檢查存取權杖是否可用。
  3. 如果是,應用程式已通過驗證,可以讓使用者移到下一個作業。如果沒有存取權杖,則應用程式瀏覽至包含 web 檢視的 XAML 頁面中。
  4. XAML 頁面會設定載入驗證結束點] 頁面上的網頁檢視的初始 URL。XAML 頁面也會訂閱 WebView WebNavigationCompleted 事件,以監視此控制項中的流量。您將學習如何建立初始 URL 的結構更進一步的文件中。
  5. 網頁檢視載入 HTML 驗證端點。
  6. 使用者輸入 HTML 驗證頁面的使用者名稱和密碼。請注意,這種互動完全是在使用者和 OneDrive 伺服器之間。XAML 頁面只是做的容器。
  7. 使用者按下送出表單,以驗證伺服器的 [HTML] 按鈕。如果使用者已設定完成,額外的頁面會顯示處理雙因素驗證。
  8. 如果是正確的認證,驗證伺服器會重新導向至特殊的 URL,表示成功登入 web 檢視。此 URL 也有存取權杖作為其中一個查詢字串參數。XAML 頁面會偵測重新導向發生,而且可以剖析存取權杖從 web 檢視的新 URL。
  9. [驗證] 頁面會重新導向 URI 的存取權杖。
  10. 應用程式導覽回到原始的 XAML 頁面。存取權杖的進一步要求儲存。

OAuth 工作流程
[圖 2 OAuth 工作流程

注意: 雖然並不一定要了解 OAuth 的運作方式,Windows 10 開發人員是真有呼叫 WebAuthenticationBroker 的簡單替代方法。在本文中,我使用 「 低層級 」 OAuth 機制,我將說明如何在下一篇文章 WebAuthenticationBroker。

了解範圍

當使用者登入時,應用程式需要各種功能,它必須通知 OneDrive 的服務。這是指定範圍中的驗證 URL。服務目前支援下列範圍:

  • 單一登入: wl.signin。
  • 離線存取: wl.offline_access。這可讓您取得重新整理權杖的應用程式。使用語彙基元的非固定格式的驗證時,會忽略這個領域。
  • 唯讀存取: onedrive.readonly。這可讓您的應用程式只能唯讀存取的檔案和資料夾。如果應用程式嘗試修改檔案,或將新的檔案上傳,服務會傳回錯誤碼 403 禁止。
  • Readwrite 存取: onedrive.readwrite。這可讓您的應用程式讀取和寫入權限的檔案和資料夾。
  • AppFolder: onedrive.appfolder。這可讓應用程式存取所謂的應用程式資料夾。我將討論更多詳細資料在本文稍後的這個特殊資料夾。請注意,此範圍會自動授與要求 readwrite 範圍時。不過,明確地要求 appfolder 將會導致此領域中所示的對話方塊中會提及 [圖 3, ,也就是更好的 ux。

[圖 3 啟動驗證

if (!_service.CheckAuthenticate(
  async () =>
  {
    var dialog = new MessageDialog("You are authenticated!", "Success!");
    await dialog.ShowAsync();
    Frame.GoBack();
  },
  async () =>
  {
    var dialog = new MessageDialog("Problem when authenticating!", "Sorry!");
    await dialog.ShowAsync();
    Frame.GoBack();
  }))
{
  Frame.Navigate(typeof (AuthenticationPage));
};

使用者驗證網頁中輸入其認證後,他已顯示對話方塊,詢問以確認應用程式,要求的權限中所示 [圖 4。使用者可以隨時變更他思考,並撤銷的權限。若要這樣做,在使用者登入其帳戶在 OneDrive 網站,瀏覽至 [安全性和隱私權,並選取應用程式和服務] 下的 [管理] 的權限連結。在範例中,您將一律要求單一登入、 readwrite 和 appfolder 存取。

驗證確認
[圖 4 驗證確認

建立初始的 URL

用來啟動驗證程序的 URL 必須包含關於應用程式本身、 要求的功能 (領域)、 驗證模式和重新導向 URI 的資訊。

驗證模式可以是語彙基元或程式碼。在這篇文章和範例,我會使用權杖模式中,這表示使用者必須確認在每個新啟動的應用程式,或在一個小時後登入。這聽起來很麻煩的是,但實際上使用者只具有中所示,在 [驗證] 對話方塊中,按 [是] 確認登入 [圖 4

重新導向 URI 是要 OneDrive 服務將會重新導向應用程式的登入成功時的位址。Web 應用程式,它可以是自己的應用程式中頁面的 URI,設定 API 設定] 索引標籤在 OneDrive 開發人員中心] 中。但是,如果 UWP 應用程式中,您應該將此欄位空白。相反地,您將依賴預先定義的重新導向 URI:

htt://login.live.com/oauth20_desktop.srf

將所有項目放在一起

現在您已了解如何根據 OAuth 驗證運作,我們來看一些程式碼。您可以遵循此簡單範例中按一下 [驗證] 按鈕。

您使用名為 OneDriveService PCL 中實作的類別。OneDriveService 具現化 App.xaml.cs 中,您將用戶端識別碼傳遞給它。

首先,您 MainPage 要求 OneDrive 服務是否它已通過驗證,這表示,存取權杖已存在。您將兩個委派傳遞至 CheckAuthenticate 方法呼叫: 如果驗證成功,要呼叫的動作和動作發生錯誤。

如果服務不已通過驗證,MainPage 會使用其框架屬性來瀏覽至 AuthenticationPage 中所示 [圖 5。此頁面是簡單的 XAML 頁面,以接受整個畫面,其中使用者會輸入使用者名稱和密碼,並確認 web 檢視。

[圖 5 AuthenticationPage 的程式碼

public sealed partial class AuthenticationPage
{
  private readonly OneDriveService _service;
  public AuthenticationPage()
  {
    InitializeComponent();
    _service = ((App)Application.Current).ServiceInstance;
    Loaded += (s, e) =>
    {
      var uri = _service.GetStartUri();
      Web.Navigate(uri);
    };
    Web.NavigationCompleted += (s, e) =>
    {
      if (_service.CheckRedirectUrl(e.Uri.AbsoluteUri))
      {
        _service.ContinueGetTokens(e.Uri);
      }
    };
    Web.NavigationFailed += (s, e) =>
    {
      _service.ContinueGetTokens(null);
    };
  }
}

載入頁面時,您會取得從 OneDriveService 驗證 URI:

https://login.live.com/oauth20_authorize.srf?client_id=000000004C169646&
scope=wl.signin+onedrive.readwrite+onedrive.appfolder&response_type=token&
redirect_uri=https%3A%2F%2Flogin.live.com%2Foauth20_desktop.srf

所述,此 URI 包含所有必要的資訊,例如用戶端識別碼、 用戶端密碼、 範圍、 重新導向 URI,依此類推。

請注意,網頁檢視將會重新導向幾次之前的存取權杖會傳回。這就是為什麼您一定要檢查的重新導向 URI NavigationCompleted 事件中 web 檢視。最後偵測到 oauth20_desktop.srf URI 時,OneDriveService 會擷取查詢字串參數的存取權杖。在查詢字串中,會傳遞 (到期時間、 語彙基元型別、 範圍、 使用者識別碼等等) 的其他資訊,但您只要略過它這裡。使用存取權杖重新導向 URI 是以下縮寫:

https://login.live.com/oauth20_desktop.srf?lc=1033#access_token=EwB4Aq1D...1iiZA%3d&
token_type=bearer&expires_in=3600&scope=wl.signin%20onedrive.readwrite%20onedrive.appfolder
%20onedrive.readonly&user_id=8e5323e8b7c7a0928d03e10811531234

使用者通過驗證之後,應用程式可以啟動檔案和資料夾進行互動。在本文中,我將專注於一些作業,但擴充以包括其他服務應用程式是相當簡單,一旦了解原則。

根資料夾

首先,我將說明如何在根資料夾中。這個資料夾會在您的 OneDrive 中是唯一,並為每個其他項目的父系。

每個文件,取得根資料夾可以在 OneDrive 中,使用下列要求: 取得 /drive/root。此要求會傳回 JSON 回應述 bit.ly/1M5w4NV。可以還原序列化 JSON 回應,其內含的資訊可用於進一步的要求。

檔案和資料夾結構 這個時候,請務必了解如何結構化檔案系統。OneDrive 依賴 facet 類別,以提供檔案和資料夾的相關資訊的系統。比方說,檔案可以也是映像並將相片,並提供其他資訊的檔案 (如影像和攝影機機型相片的寬度/高度)。下列清單顯示目前可用的 facet 和某些最重要屬性:

  • 項目 (名稱、 識別碼、 下載 url、 父參考等等)
  • 資料夾 (子系計數)
  • 檔案
  • 音訊 (專輯、 演出者、 位元速率,持續時間、 標題等)
  • 映像 (寬度、 高度)
  • 相片 (數位相機製造商及取得日期時間的模型)
  • 影片 (持續時間、 位元速率、 寬度、 高度)

當您將新的檔案上傳至 OneDrive 時,就會自動分析,而且會加入一些中繼資料。例如,Word 文件只是一個檔案。但與數位相機拍攝相片以及映像,除了檔案。這些 facet 的每個執行檔的其他資訊清單中所示。

當您剖析您從 OneDrive 服務取得的 JSON 時,您可以在 C# 類別對應這些型別。藉由檢查 JSON,您可以輕鬆地找出項目是否資料夾、 檔案、 影像、 影片等等。例如, [圖 6 顯示根資料夾的 JSON 回應的擷取。您可以看到資料夾屬性執行資料夾的子系計數的相關資訊。如果您已取得相片的相關資訊,您會看到填滿讓相機和模型,相關的資訊以及相關的寬度和高度,分別的映像和相片屬性。

在這篇文章提供的範例應用程式,您將還原序列化的類別包含在 [回應] 資料夾中,會對應到 facet 系統中的 JSON。

現在您已了解回應的運作方式,您可以輕鬆存取的根資料夾的資訊,如下所示的程式碼:

var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
  new AuthenticationHeaderValue("Bearer", AccessToken);
var uri = new Uri("https://api.onedrive.com/v1.0/drive/root");
var json = await client.GetStringAsync(uri);
var rootFolder = JsonConvert.DeserializeObject<ItemInfoResponse>(json);

若要查看作用中的程式碼,您可以執行簡單的範例,並按下 [驗證] 按鈕,然後再取得根資料夾] 按鈕。

取得資料夾的子系[圖 6, ,回應只包含有關資料夾的中繼資訊。您知道多少的子系資料夾擁有,但您需要執行一個或多個要求來取得子系清單。在這裡,喔 OneDrive 文件可協助,您需要的狀態要求並/項目 / {項目-識別碼} 的 GET / 子系中所示 [圖 7

[圖 6 JSON 回應根資料夾

{
  "createdBy": {
    "user": {
      "displayName": "Laurent Bugnion",
      "id": "fb0d8f9700498123"
    }
  },
  "createdDateTime": "2010-11-27T17:09:25.513Z",
  "id": "FB0D8F97004979CD!ABC",
  "lastModifiedBy": {
    "user": {
      "displayName": "Laurent Bugnion",
      "id": " fb0d8f9700498123"
    }
  },
  "lastModifiedDateTime": "2015-10-04T14:36:36.217Z",
  "name": "root",
  "size": 178558187077,
  "webUrl": "https://onedrive.live.com/?cid=fb0d8f9700498123",
  "folder": {
    "childCount": 18
  }
}

[圖 7 取得子系清單

var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
  new AuthenticationHeaderValue("Bearer", AccessToken);
var request = string.Format("/drive/items/{0}/children", info.Id);
var uri = new Uri(
  "https://api.onedrive.com/v1.0"
  + request);
var json = await client.GetStringAsync(uri);
var response = JsonConvert.DeserializeObject<ParseChildrenResponse>(json);
return response.Value;

[圖 7, ,JSON 還原序列化至名為 ParseChildrenResponse 的類別。這一次會對應至 JSON 回應,以包裝具名的值為 JavaScript 陣列的子系清單。會顯示 ParseChildrenResponse 類別 [圖 8

[圖 8 ParseChildrenResponse 類別

public class ParseChildrenResponse
{
  public IList<ItemInfoResponse> Value
  {
    get;
    set;
  }
  [JsonProperty("@odata.nextLink")]
  public string NextLink
  {
    get;
    set;
  }
}

每個子系都 ItemInfoResponse,因為您知道如何處理這些,並決定每一個子資料夾、 檔案、 相片、 音效檔案等。

請注意,如果您想要避免將兩個呼叫以擷取資料夾資訊,並填入它的子系清單時,它也可以使用下列要求,並在單一呼叫中的所有項目:

 

GET /drive/items/root?expand=children

了解分頁 OneDrive 服務所傳送的回應時存取資料夾的子系很多,可能會不完整,而且需要分頁。根據預設,服務只會傳回最大值 200 的子系清單。如果您在瀏覽的資料夾有較多,屬性會加入至子系,稱為 「 @odata.nextLink 」 清單和中可以看到 [圖 8, 等。此屬性包含應用程式需要執行以前往下一步 」 頁面]。 在下一個要求的 URI 在 UWP 應用程式中,您可以選擇立即呼叫服務以取得下一個頁面的項目 (這是可行 [確定],因為較長清單會模擬化),或者您可以顯示更多] 按鈕並實作應用程式中的頁面巡覽。

瀏覽子 資料夾的識別碼之後,您可以輕鬆地瀏覽此資料夾中使用下列要求:

GET /drive/items/{item-id}

當您已經有資料夾的識別碼,但有時候您不需要這項資訊,這很適合。另一種語法可讓您擷取資料夾的資訊,而使用其相對於根目錄的路徑。您會看到這個語法中的 [圖 9

[圖 9 瀏覽的子資料夾的路徑

var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
  new AuthenticationHeaderValue("Bearer", AccessToken);
var request = string.Format("/drive/root:/{0}", path);
var uri = new Uri(
  "https://api.onedrive.com/v1.0"
  + request);
var json = await client.GetStringAsync(uri);
var result = JsonConvert.DeserializeObject<ItemInfoResponse>(json);
return result;

應用程式資料夾

OneDrive 都有一些特殊的資料夾,例如音樂、 文件、 相片,依此類推。最近導入的其中一個特殊資料夾: 應用程式資料夾中。這是特殊的資料夾所使用的應用程式執行個體來保存漫遊設定、 上傳備份,依此類推。請注意,應用程式資料夾不安全或以任何方式隱藏。事實上,它位於名為應用程式,直接位於使用者的 OneDrive 的根資料夾中。應用程式的應用程式資料夾的相同名稱 OneDrive 應用程式中,輸入當您註冊以取得用戶端識別碼。請注意,可能會以不同的語言,取決於 OneDrive 應用程式的設定當地語系化應用程式的名稱。使用者對應用程式資料夾中,透過 OneDrive 網站或應用程式的完整存取權,如果選擇甚至可能會刪除資料夾。

引進了應用程式資料夾的概念之前,應用程式 (而且有許多仍是) 儲存其設定和 OneDrive 根目錄中,或自訂資料夾中的其他檔案。使用應用程式資料夾,這些項目更清楚和更好的 ux。根據 OneDrive 文件 (bit.ly/1MBUkS2),要求取得應用程式資料夾的資訊:

GET /drive/special/approot

如您所見,很容易實作應用程式資料夾中的任何應用程式!

下載檔案

何種用途 OneDrive 是如果您無法上傳或下載檔案? 在本節與下一步,您將了解如何執行這項重要作業,這是極為容易。

若要下載檔案的內容,OneDrive 建立 DownloadUrl 另存為項目回應中的屬性。但是請注意,URL 是唯一有效的一段時間,因此如果已快取的檔案資訊,您可能需要的資訊再次從服務取得第一個,如下所示在 圖 10

[圖 10 下載檔案的內容

public async Task<Stream> RefreshAndDownloadContent(
  ItemInfoResponse model,
  bool refreshFirst)
{
  var client = new HttpClient();
  client.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Bearer", AccessToken);
  // Refresh the item's information
  if (refreshFirst)
  {
    var request = string.Format("/drive/items/{0}", model.Id);
    var uri = new Uri(
      "https://api.onedrive.com/v1.0"
      + request );
    var json = await client.GetStringAsync(uri);
    var refreshedItem =
      JsonConvert.DeserializeObject<ItemInfoResponse>(json);
    model.DownloadUrl = refreshedItem.DownloadUrl;
  }
  var response = await client.GetAsync(model.DownloadUrl);
  var stream = await response.Content.ReadAsStreamAsync();
  return stream;
}

一旦您取得檔案的內容資料流時,您可以在本機進行處理,並儲存它等等。簡單的範例會要求使用者輸入的位置使用 FileSavePicker 來儲存檔案。

上傳檔案

同樣地上, 傳檔案也是相當簡單之後取得的檔案資料流。Windows 10 中都有 StorageFile 執行個體中,以 FileOpenPicker 為例。一旦讀取資料流時,您可以將它上傳至 「 OneDrive。根據文件,您需要使用 PUT 作業:

PUT /drive/items/{parent-id}:/{filename}:/content

HttpClient 支援 PUT 方法 HttpContent 執行個體。在此情況下,由於您擁有的未經處理的檔案資料流時,您可以使用 StreamContent 執行個體。如果您想要儲存所有的文字檔案,您可以使用 StringContent,依此類推。

要傳遞至服務所需的其他資訊是儲存檔案之資料夾的識別碼。在簡單的範例所示 [圖 11, ,parentId 會傳遞至正在上傳的方法。請注意,PUT 作業傳回的 JSON 內容描述檔案的新資訊 OneDrive,例如它的識別碼、 Web URL 下載 URL,依此類推。

[圖 11 上傳檔案的內容

var content = new StreamContent(stream);
var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
  new AuthenticationHeaderValue("Bearer", AccessToken);
var uri = new Uri(
  "https://api.onedrive.com/v1.0"
  + string.Format(
    "/drive/items/{0}:/{1}:/content",
    parentId,
    fileName));
var response = await client.PutAsync(uri, content);
var json = await response.Content.ReadAsStringAsync();
var result = JsonConvert.DeserializeObject<ItemInfoResponse>(json);
return result;

除了簡單的上傳所述,OneDrive API 也提供多個部分,可繼續上載使用不同的語法。簡單的上傳小於 100 MB 的檔案是 [確定]。如果是較大的檔案,您應該參閱文件,網址 bit.ly/1PB31Cn

取得唯一的連結

我將在這裡示範的上一個作業是如何取得項目的唯一的 「 共用 」 連結。這項作業很方便的唯一連結給朋友透過傳送電子郵件、 簡訊、 社交媒體,依此類推。圖 12 示範如何取得這項資訊,根據項目的識別碼。在範例中,您可以取得您在上一個示範上載檔案的連結。

[圖 12 取得共用連結

public async Task<LinkResponseInfo> GetLink(
  LinkKind kind,
  string fileId)
{
  // LinkKind id View or Edit
  var client = new HttpClient();
  client.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Bearer", AccessToken);
  var request = string.Format("/drive/items/{0}/action.createLink", fileId);
  var uri = new Uri(
    "https://api.onedrive.com/v1.0"
    + request);
  var requestJson = JsonConvert.SerializeObject(
    new RequestLinkInfo
    {
      Type = kind.ToString().ToLower()
    });
  var content = new StringContent(
    requestJson,
    Encoding.UTF8,
    "application/json");
  var response = await client.PostAsync(uri, content);
  var result = JsonConvert.DeserializeObject<LinkResponseInfo>(
    await response.Content.ReadAsStringAsync());
  return result;
}

根據文件,則要求會有點不同於 GET 要求您放置在過去,因為服務需要更詳細的資訊。「 共用連結 」 要求的是,如下所示: 張貼 /drive/items/{item-id}/action.createLink。您要張貼至服務的資訊是 JSON 程式碼片段的連結類型: 「 檢視 」 或 「 編輯 」,例如: {"type": 「 檢視 」}

總結

有一些我不在本文中,例如刪除檔案、 更新檔案的內容和同步處理的變更說明的其他作業。一般情況下,不過,此作業遵循相同的模式,而且可以使用 HttpClient HTTP 方法和 JSON 來執行。由於 Microsoft.NET Framework 中非同步程式設計的進階功能,這類作業是非常順暢且在任何支援的架構,包括 Windows 10,但也 WPF、 Windows Phone、 Xamarin.iOS、 Xamarin.Android 等中容易實作。與這類的易用性,實在沒有理由不會有某種類型的定域機組互動 UWP 應用程式,例如備份內容或漫遊設定。在下一步的文章中,您會看到剛發行的 PCL OneDrive 小組如何協助您進行這項整合更容易。


Laurent Bugnion是資深主管 IdentityMine 領導公司 (與黃金級合作夥伴) 的其中一個 Microsoft 技術。他目前居住在蘇黎世,瑞士。2010 本書 」 Silverlight 4 Unleashed,「 發行的 Sam,是進階的延長至 「 Silverlight 2 Unleashed 」 (2008)。他寫入數個發行集、 在他的第九個年份,是 Microsoft MVP 及為他的第二個年份,是 Microsoft 區域經理。他是知名的開放原始碼架構 MVVM Light for Windows,WPF,Xamarin,以及有關 MVVM Light 受歡迎的 Pluralsight 參考課程作者。在他的部落格 galasoft.ch

衷心感謝以下技術專家對本文的審閱: Corrado Cavalli (大地) 和 Ryan Gregg (Microsoft)