Microsoft Graph API を実行して SharePoint のドキュメント情報を取得する場合に必要な itemId の取得の仕方 (C#)

## 1. はじめに

Microsoft Graph API を利用すると、SharePointのサイトの情報を取得したり、SharePointのファイルをダウンロードしたり、アップロードしたりと様々なことができるようになります。
ただ、SharePoint のドキュメントの情報を Microsoft Graph API を使って取得する際にsiteId、driveId、itemIdなどの情報の取得が必要になることもあるかと思います。

今回はitemIdに絞って、そのIdの取得方法をいくつかご紹介します。

言語はC#です。

なお、以降では、APIの実行方法については触れていません。  
実際に動かして確認したい場合は、以下の記事を参考に実装してください。 
 - [Graph Client Service を使って実行](https://qiita.com/Takuma_Kondo/items/a9cefb6128e092ff27a9)
 - [HTTPのGETで実行](https://qiita.com/Takuma_Kondo/items/8102977024231d33fdb1)


## 2. itemIdの取得

そもそもドキュメントの情報さえ取得できてしまえば、itemIdは取得できます。
矛盾していることを言いますと、SharePointのドキュメント情報は以下の記事で紹介している通り、
siteid,itemIdで取得できます。
 - [SharePoint のファイルを Microsoft Graph API を使用してダウンロードする(C#)　～実装編～](https://qiita.com/Takuma_Kondo/items/a9cefb6128e092ff27a9)

なので、本記事を読んで、itemIdをわざわざ取得できるのであれば、itemIdを取得する必要ないのでは・・・？となる方も出てくるかと思います。
実際に私もそうでしたので・・・

ということで、以下は様々なドキュメントの情報を取得してくる方法だととらえていただいても構いません。ただ、あくまでitemIdの取得方法として紹介していきます。

基本的に以降は、ドキュメントを取得するAPIを呼び出して、そのレスポンスからitemidを取得する流れとなります。
取得するドキュメント情報のDriveItemレスポンスの例を以下に示します。

```C#
HTTP/1.1 200 OK
Content-type: application/json

{
  "createdBy": {
      "user": {
          "id": "efee1b77-fb3b-4f65-99d6-274c11914d12",
          "displayName": "Ryan Gregg"
      }
  },
  "createdDateTime": "2016-03-21T20:01:37Z",
  "cTag": "\"c:{86EB4C8E-D20D-46B9-AD41-23B8868DDA8A},0\"",
  "eTag": "\"{86EB4C8E-D20D-46B9-AD41-23B8868DDA8A},1\"",
  "folder": { "childCount": 120 },
  "id": "01NKDM7HMOJTVYMDOSXFDK2QJDXCDI3WUK",
  "lastModifiedBy": {
      "user": {
          "id": "efee1b77-fb3b-4f65-99d6-274c11914d12",
          "displayName": "Ryan Gregg"
      }
  },
  "lastModifiedDateTime": "2016-03-21T20:01:37Z",
  "name": "OneDrive",
  "root": { },
  "size": 157286400,
  "webUrl": "https://contoso-my.sharepoint.com/personal/rgregg_contoso_com/Documents"
}
```
上記の”id”プロパティがItemIdにあたります。

### 2.1. キーワード検索の結果から取得

キーワード検索の手法としては、特定のサイト以下のドキュメント情報を検索し、そのdriveItremレスポンスからitemIdを得る手法です。  

Graph Client Service を利用する場合は、以下を実行します。
```C#
var result = await graphClient.Drives["{drive-id}"].SearchWithQ("{q}").GetAsSearchWithQGetResponseAsync();
```

なお、上記あえてdriveIdを使ったものをご紹介しています。  
driveIdですが、実はこの類のことをしているとこちらもよく目にするIdです。  
driveIdは、siteIdさえ取得できていれば、取得することができます。  
以下はSiteIdからそのドライブ情報を取得するエンドポイントです。  
```C#
$"https://graph.microsoft.com/v1.0/sites/{siteId}/drive/"
```
あとはレスポンスからdriveIdを取得すればよいです。  

HTTPのGETメソッドで実行する場合は以下のエンドポイントを使用します。
```C#
$"https://graph.microsoft.com/v1.0/sites/{siteId}/drive/root/search(q='{searchQuery}')"
```
### 2.2. 相対パスから取得

SharePointのドキュメントの情報の取得方法として、相対パスから取得する方法があります。  
必要な相対パスの情報は、サイトのルートからのフォルダ構造の情報になります。  

以下のエンドポイントをHTTPのGETで実行します。    

```C#
string endpoint = $"https://graph.microsoft.com/v1.0/sites/{siteId}/drives/{driveId}/root:/{relativePath}";
```
後はレスポンスからidを取得すれば完了です。

ここでいうrelativePathについて間違いのないように詳しく説明します。  

例えば「Sample」という名前のSharePointサイトがあるとします。  
Sample サイトには、ルートのドキュメントフォルダがあり、その下にさまざなフォルダ、ファイルが格納されているとします。  
例：｛ルートのドキュメントのフォルダ｝/ AAA / BBB / CCC / sample.xlsx  

この場合、必要な情報は ”AAA / BBB / CCC / sample.xlsx”になります。  

Grapf Client Serviceの実行は確認できていませんので、記載しませんが、同じものがあると思います。  

### 2.3. SharePointのUrlから取得

2.2.章の方法とは似ているようで全く異なる手法にはなります。  
そもそもの話をしますが、SharePointのUrlというのは、ローカルのファイルパスのように階層構造になっているわけではなく、何か不明な情報がたくさん載っているようなUrlになっていると思います。  
従って、2.2章のように相対パスを詳しく知らない場合は、サイトのUrlを直接実行して、ドキュメントの情報を取します。  

以下のエンドポイントをHTTPのGETで実行します。 
```C#
string endpoint = $"https://graph.microsoft.com/v1.0/shares/{encodedUrl}/driveItem"
```
後はレスポンスからidを取得すれば完了です。

Grapf Client Serviceの実行は確認できていませんので、記載しませんが、同じものがあると思います。 

## 3. おわり

ここまでで、ItemIdの取得を紹介しました。  
ちなみにsiteIdの取得も[こちら](https://qiita.com/Takuma_Kondo/items/226fcab3b3b356f29ccb)の記事で同じように紹介してますので興味があればご覧ください。  

今後も Mixrosoft Graph API については、さまざまな記事を書いていこうと思います。