SharePoint 製品一覧 (ストア)
SharePoint 2010 開発のステップ・バイ・ステップ
Windows Azure 入門
Windows Azure How-To 集
WCF / WF 入門
[This article's sample code is 20111219_CloudStorageSample (GitHub).]
こんにちは。
以前の投稿 で、Windows Live SkyDrive を扱ったプログラミングについて軽く触れましたが、ご存じの方も多いかと思いますが、SkyDrive の開発環境として、新たに REST API が提供され、これを使用した Live SDK v5.0 も提供されています。(下記ドキュメントを参照。)今回は、この REST API (新しい Live Connect APIs) について簡単に紹介したいと思います。
補足 : 従来は SkyDocsService.svc というプログラムから利用可能な (SkyDrive の) サービスが提供されていましたが、正式に開発者向けにリリースされているサービスではなく、���キュメントもほとんどありませんでした。今回は、下記の通り、ちゃんと公開されたサービスになっています。(なお、これに伴い、この SkyDocsService.svc は、どうも廃止されてしまったようです。。。)
[MSDN] SkyDrive Core Concepthttp://msdn.microsoft.com/en-us/windowslive/hh561489
[MSDN] SkyDrive REST API の一覧 (フォルダー操作 / ファイル操作 関連)http://msdn.microsoft.com/en-us/windowslive/hh561740
アプリケーション構築のおおまかな流れは以下の通りです。
今回は、Live SDK は使用せず、Windows Live SkyDrive の REST API を直接呼び出す方法について注意点などを記載します。
まず、Windows Live の OAuth 2.0 を使った認証とアクセス トークン (access token) の取得までの流れについては、以下に手順や考え方がまとまっていましたので、是非 参考にしてください。(下記に要点なども整理されていますので、ここでは、説明を省略します。)
[gihyo.jp] 使ってみよう! Windows Live SDK/APIhttp://gihyo.jp/dev/serial/01/wl-sdk/0045?page=1
補足 : この際、以下の 2 点に注意してください。まず、上記で使用している CLIENT_ID などは、あらかじめ、下記から取得します。https://manage.dev.live.com/Applications/Index特に、Web アプリケーション開発の場合、認証時にリダイレクトをおこないますが、この際、リダイレクト先のドメインとして、ここで設定した [Redirect Domain] を使用しないとエラーになるので、デバッグ方法などに注意してください。(例えば、[Redirect Domain] に本番環境のアドレスを入れて、ASP.NET 開発サーバーの localhost などから使うことはできません。いったん Authentication Code などを取得してからローカル環境でデバッグをおこなうなど、工夫してください。)また、もう 1 つの注意点として、以下で紹介するサンプルを動かすには、Scope として wl.skydrive_update を必ず含めてください。Scope は、SkyDrive の利用目的に応じて適切な値を設定する必要があり、ドキュメントの参照のみの場合は wl.skydrive で充分ですが、下記のように更新 (ファイル登録など) をおこなうには wl.skydrive_update を指定します。(なお、Scope を複数指定するには、wl.signin%20wl.skydrive_update のように指定します。)
補足 : OAuth 2 を使った認証処理をおこなうライブラリーとして、DotNetOpenAuth を使うこともできます。この方法については、こちらのブログ で解説されています。(ここでは、説明を割愛します。)
アクセス トークン (Access Token) が取得できたら、あとは、REST API を呼び出すだけです。
例えば、フォルダー一覧 (SkyDrive のフォルダー一覧) を取得する場合は、以下の通り呼び出します。(下記で、Access Token Value には、取得したアクセス トークンの値を設定してください。)
GET https://apis.live.net/v5.0/me/skydrive/files?access_token=Access Token Value HTTP/1.1
なお、結果は、下記の通り Json で返ってきますので、DataContractJsonSerializer、または WCF Web Api の JsonValue などを使用して、結果を取得してください。(下記の通り、返り値の型は決まっていますので、前者でも充分です。)
{ data : [ { "id": "folder.9c0af81b735e29ea.9C0AF81B735E29EA!113", "from": { "name": "剛 松崎", "id": "9c0af81b735e29ea" }, "name": "写真", "description": null, "parent_id": "folder.9c0af81b735e29ea", "upload_location": "https://apis.live.net/v5.0/folder.9c0af81b735e29ea.9C0AF81B735E29EA!113/files/", "count": 0, "link": "https://skydrive.live.com/redir.aspx?cid\u003d9c0af81b735e29ea\u0026page\u003dview\u0026resid\u003d9C0AF81B735E29EA!113\u0026parid\u003d9C0AF81B735E29EA!112", "type": "folder", "shared_with": { "access": "Just me" }, "created_time": "2008-11-04T05:39:24+0000", "updated_time": "2008-11-04T05:39:24+0000" }, { ... }, { ... } ]}
また、以下は、フォルダーへファイルを登録 (アップロード) します。下記で、folder.9c0af81b735e29ea.9C0AF81B735E29EA!114 はフォルダーの ID で、上記の結果から取得できます。(また、保存するファイルの種類に応じて Content-Type を設定してください。下記の例では、Word 文書をアップロードしています。)
POST https://apis.live.net/v5.0/folder.9c0af81b735e29ea.9C0AF81B735E29EA!114/files?access_token=Access Token Value HTTP/1.1Content-Type: multipart/form-data; boundary=A300tsmatsuzdemox--A300tsmatsuzdemoxContent-Disposition: form-data; name="file"; filename="test.docx"Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.documentWord 文書のストリーム、または、そのエンコード文字列 . . .--A300tsmatsuzdemox--
この SkyDrive の REST API を使用した Web アプリケーション (ASP.NET MVC) のサンプルを下記に作成しましたので、細かなプログラミング方法などについてはソース コードをご参照ください。C# のサンプル コードですが、.NET 以外の開発言語からでも、同様に実装できます。(Json の Parse の箇所は、開発言語にあわせて適した方法で実装してください。)
デモ サイト :http://cloudstoragesample.cloudapp.net/
ソース コードの Download (GitHub) :https://github.com/tsmatsuz/20111219_CloudStorageSample
このサンプル アプリケーションの使い方は、「Office & Office 365 Development Sample」 に追記しました。このサンプルでは、OpenXML SDK で作成した Word 文書を SkyDrive に保存しています。(Json の処理では、DataContractJsonSerializer を使用しています。) Word 2007 以上を持っていないユーザーでも、SkyDrive の Office Web Apps で (ブラウザーを使って) 閲覧できます。
補足 : Access Token は、上記の通り URL の Query String に指定するため危険に思えますが、1 時間ほどで期限切れ (Expire) になります。このダウンロード サンプルでは省略していますが、期限切れの場合、再度、同じステップで Access Token を取得しなおしてください。(利用者が同一ブラウザーを使用している場合、Windows Live ID が設定する Cookie が残っているため、ユーザー ID / パスワードの入力画面は表示されず、accss_token を取得できます。)また、利用者がブラウザーを閉じたあとでも、Refresh Token と呼ばれるものを使用して新しい Access Token を取得しなおすことで、処理を継続できます。(上記のダウンロード サンプルに、コメントとして記載しています。) Refresh Token を取得するには、最初の Authentication Code の取得の際 (ログインの際) に、scope として wl.offline_access を追加してください。また、Refresh Token を使用して Access Token を取得する際は、下記のデータを POST してください。client_id=...&redirect_uri=...&client_secret=...&refresh_token=...&grant_type=refresh_token