SharePoint のファイルを Microsoft Graph API を使用してダウンロードする　～API理解編～

## 1. はじめに

本記事では、SharePointに格納してあるドキュメントを Microsoft Graph API を使用してダウンロードする方法をご紹介します。  
最近では、ネットワーク共有フォルダを廃止し、SharePointに移行するといった傾向がみられます。  
今回はそんな SharePoint のドキュメントのダウンロードに必要なAPIにフォーカスして説明します。  

## 2. SharePoint のファイルをダウンロード

SharePointのドキュメントをダウンロードには、Microsoft Graph API を使用します。  
ただMicrosoft Graph API を使用する場合、Azureのアプリの登録が必須ですので先にそちらの設定を行ってください。  

※Azureのアプリ登録についての記事は[こちら](https://qiita.com/Takuma_Kondo/items/3746c67b0b4f01f4e42f)

### 2.1. 処理の流れ

Microsoft Graph API を使用してどのようにSharePointのファイルをダウンロードしていくのかについての概要を先に説明します。  
APIを使用した処理の流れは、
①Microsoft Graph API を使用してレスポンス(SharePointのドキュメントの情報)を受け取る。  
②レスポンス(SharePointのドキュメントの情報)からダウンロードUrlを取得。  
③ダウンロードUrlを使用して実際にファイルをダウンロード。  
になります。  

本記事では、APIの部分にフォーカスして理解を深めていきます。
実装については[こちら](https://qiita.com/Takuma_Kondo/items/a9cefb6128e092ff27a9)の記事で説明しておりますので、併せてご覧ください。

### 2.2. 使用するAPI

Microsoft Graph API からファイルのダウンロードに使用するAPIは、以下になります。
```
GET /drives/{drive-id}/items/{item-id}/content
GET /groups/{group-id}/drive/items/{item-id}/content
GET /me/drive/root:/{item-path}:/content
GET /me/drive/items/{item-id}/content
GET /shares/{shareIdOrEncodedSharingUrl}/driveItem/content
GET /sites/{siteId}/drive/items/{item-id}/content
GET /users/{userId}/drive/items/{item-id}/content
```
※詳細は[MSの公式ドキュメント](https://learn.microsoft.com/ja-jp/graph/api/driveitem-get-content?view=graph-rest-1.0&tabs=csharp)を参照。  

いきなりこんなものが出てきても何のことやら・・・となるかもしれませんが、こちらを使用していきます。  
今回はこの中でも、SharePointのファイルをダウンロードする際に使用する以下のAPIをピックアップして解説します。  
```
GET /sites/{siteId}/drive/items/{item-id}/content
```
上述のAPIを実行するのに必要なのは、[siteId]と[item-id]です。

**siteId :** は各サイトが持つユニークなIDとなります。  
※この場合のサイトとは、SharePointのルートのサイト指します。  

**itemId :** はそのアイテム(SharePointのファイルやドキュメント)が持つユニークなIDとなります。    

これら2つのIdを取得することで、ダウンロードに必要な情報を取得するためのAPI呼び出しが可能になるわけです。  

では、この[siteId]と[item-id]はどのようにして取得したらよいのか・・・？となりますよね。  
それについては以下の記事でご説明していますので、こちらの記事をご覧ください。  
 - [siteIdの取得](https://qiita.com/Takuma_Kondo/items/226fcab3b3b356f29ccb)
 - [itemidの取得](https://qiita.com/Takuma_Kondo/items/878efa2ae0db324050a4)

### 2.3. APIのレスポンス

2.2章で示したAPI を使用すると、どのような情報を取得することができるのでしょうか？  
実際には、APIを実行すると以下のようなdriveItemレスポンスを受け取ることができます。

driveItemレスポンス
```JSON
{
  "audio": { "@odata.type": "microsoft.graph.audio" },
  "bundle": { "@odata.type": "microsoft.graph.bundle" },
  "content": { "@odata.type": "Edm.Stream" },
  "cTag": "string (etag)",
  "deleted": { "@odata.type": "microsoft.graph.deleted"},
  "description": "string",
  "file": { "@odata.type": "microsoft.graph.file" },
  "fileSystemInfo": { "@odata.type": "microsoft.graph.fileSystemInfo" },
  "folder": { "@odata.type": "microsoft.graph.folder" },
  "image": { "@odata.type": "microsoft.graph.image" },
  "location": { "@odata.type": "microsoft.graph.geoCoordinates" },
  "malware": { "@odata.type": "microsoft.graph.malware" },
  "package": { "@odata.type": "microsoft.graph.package" },
  "pendingOperations": { "@odata.type": "microsoft.graph.pendingOperations" },
  "photo": { "@odata.type": "microsoft.graph.photo" },
  "publication": {"@odata.type": "microsoft.graph.publicationFacet"},
  "remoteItem": { "@odata.type": "microsoft.graph.remoteItem" },
  "root": { "@odata.type": "microsoft.graph.root" },
  "searchResult": { "@odata.type": "microsoft.graph.searchResult" },
  "shared": { "@odata.type": "microsoft.graph.shared" },
  "sharepointIds": { "@odata.type": "microsoft.graph.sharepointIds" },
  "size": 1024,
  "specialFolder": { "@odata.type": "microsoft.graph.specialFolder" },
  "video": { "@odata.type": "microsoft.graph.video" },
  "webDavUrl": "string",

  /* relationships */
  "activities": [{"@odata.type": "microsoft.graph.itemActivity"}],
  "analytics": {"@odata.type": "microsoft.graph.itemAnalytics"},
  "children": [{ "@odata.type": "microsoft.graph.driveItem" }],
  "createdByUser": { "@odata.type": "microsoft.graph.user" },
  "retentionLabel": { "@odata.type": "microsoft.graph.itemRetentionLabel" },
  "lastModifiedByUser": { "@odata.type": "microsoft.graph.user" },
  "permissions": [ {"@odata.type": "microsoft.graph.permission"} ],
  "subscriptions": [ {"@odata.type": "microsoft.graph.subscription"} ],
  "thumbnails": [ {"@odata.type": "microsoft.graph.thumbnailSet"}],
  "versions": [ {"@odata.type": "microsoft.graph.driveItemVersion"}],

  /* inherited from baseItem */
  "createdBy": {"@odata.type": "microsoft.graph.identitySet"},
  "createdDateTime": "String (timestamp)",
  "eTag": "string",
  "id": "string (identifier)",
  "lastModifiedBy": {"@odata.type": "microsoft.graph.identitySet"},
  "lastModifiedDateTime": "String (timestamp)",
  "name": "string",
  "parentReference": {"@odata.type": "microsoft.graph.itemReference"},
  "webUrl": "string",

  /* instance annotations */
  "@microsoft.graph.conflictBehavior": "string",
  "@microsoft.graph.downloadUrl": "url",
  "@microsoft.graph.sourceUrl": "url"
}

```
※詳細は[MSの公式ドキュメント](https://learn.microsoft.com/ja-jp/graph/api/resources/driveitem?view=graph-rest-1.0)を参照。  

ダウンロードに必要なダウンロードurlを取得するには、以下のvalueを取得してこればよいわけです。  
```
"@microsoft.graph.downloadUrl": "url",
```
ダウンロードには必要ありませんが、レスポンスを見るとわかるように、ダウンロードUrl以外にも、**ファイル名や[siteId]や[item-id]などのID、最終更新日時、作成者**などの情報を取得することができます。  

では実際に実装へ移りましょう！ 

・・・  

と言いたいところですが、今回はここまで。実装編については[こちら](https://qiita.com/Takuma_Kondo/items/a9cefb6128e092ff27a9)の記事をご覧下さい。

## 終わり

ここまでで、利用するAPIやAPIの実行に何が必要かはなんとなく理解できましたでしょうか？
今回は「SharePointのファイルをダウンロードするには、こんなAPIを使うとできるんだ～」、「それにはこんな情報が必要なんだ～」となんとなく理解いただければ幸いです。

それでは、実装編へつづく・・・