REST API によりバッチ要求を発行する
この記事では、Microsoft SharePoint Online (およびオンプレミスの SharePoint 2016 以降) の REST/OData API と、Office 365 REST API のファイルとフォルダーのサブセットに対して、複数のクエリや操作をバッチ処理する方法について説明します。 このテクニックを使用すれば、多くの操作を組み合わせた単一の要求をサーバーに送り、単一の応答が返されるようにして、アドインのパフォーマンスを改善できます。
$batch オプションの概要
SharePoint Online (およびオンプレミスの SharePoint 2016 以降) と Office 365 API では OData $batch
クエリ オプションが実装されているため、その使用方法の詳細については公式ドキュメントに依存できます。 (別の方法として、Andrew Connell のブログで、この論題について書かれた「第 1 部 - SharePoint REST API バッチ操作」以降の投稿を確認することもできます)。
次に、主要ポイントを示します。
- 要求 URL は、ルート サービスの URL と
$batch
オプションで構成されます。たとえば、https://fabrikam.sharepoint.com/_api/$batch
またはhttps://fabrikam.office365.com/api/v1.0/me/$batch
のようになります。 - HTTP 要求本文は、MIME タイプ multipart/mixed です。
- 要求本文は、要求のヘッダーで指定される境界文字列で区切られた複数のパートに分割されます。
- 本文の各パートには、それぞれ独自の HTTP 動詞と REST URL があり、該当する場合には独自の内部本文があります。
- 1 つのパートは、1 つの読み取り操作 (または関数呼び出し)、または 1 つ以上の書き込み操作 (または関数呼び出し) からなる 1 つのChangeSet です。 ChangeSet は、それ自体 1 つの MIME タイプ multipart/mixed であり、挿入、更新、または削除の操作を含む複数のサブパートを伴います。
重要
SharePoint および Office 365 API はトランザクション対応ではなく、複数の操作が含まれる変更セットのための「全部処理するか、何も処理しないか」機能はサポートされていません。 子操作のいずれかが失敗しても、他の操作は実行を完了し、ロールバックされません。
コード サンプル
SharePoint REST/OData API に対して $batch
クエリ オプションを使用するコードのサンプル:
- C#:OfficeDev/Core.ODataBatch
- JavaScript:andrewconnell/sp-o365-rest
要求と応答の例
2 つの異なるリストに含まれるすべてのアイテムのタイトルを取得する 2 つの GET 操作をバッチ処理する未加工 HTTP 要求の例を次に示します。
POST https://fabrikam.sharepoint.com/_api/$batch HTTP/1.1
Authorization: Bearer <access token omitted>
Content-Type: multipart/mixed; boundary=batch_e3b6819b-13c3-43bb-85b2-24b14122fed1
Host: fabrikam.sharepoint.com
Content-Length: 527
Expect: 100-continue
--batch_e3b6819b-13c3-43bb-85b2-24b14122fed1
Content-Type: application/http
Content-Transfer-Encoding: binary
GET https://fabrikam.sharepoint.com/_api/Web/lists/getbytitle('Composed%20Looks')/items?$select=Title HTTP/1.1
--batch_e3b6819b-13c3-43bb-85b2-24b14122fed1
Content-Type: application/http
Content-Transfer-Encoding: binary
GET https://fabrikam.sharepoint.com/_api/Web/lists/getbytitle('User%20Information%20List')/items?$select=Title HTTP/1.1
--batch_e3b6819b-13c3-43bb-85b2-24b14122fed1--
リストの DELETE と SharePoint リストのリストの GET をバッチ処理する未加工 HTTP 要求の本文の例を次に示します。
POST https://fabrikam.sharepoint.com/_api/$batch HTTP/1.1
Authorization: Bearer <access token omitted>
Content-Type: multipart/mixed; boundary=batch_7ba8d60b-efce-4a2f-b719-60c27cc0e70e
Host: fabrikam.sharepoint.com
Content-Length: 647
Expect: 100-continue
--batch_7ba8d60b-efce-4a2f-b719-60c27cc0e70e
Content-Type: multipart/mixed; boundary=changeset_efb6b37c-a5cd-45cb-8f5f-4d648006e65d
--changeset_efb6b37c-a5cd-45cb-8f5f-4d648006e65d
Content-Type: application/http
Content-Transfer-Encoding: binary
DELETE https://fabrikam.sharepoint.com/_api/Web/lists/getbytitle('OldList') HTTP/1.1
If-Match: "1"
--changeset_efb6b37c-a5cd-45cb-8f5f-4d648006e65d--
--batch_7ba8d60b-efce-4a2f-b719-60c27cc0e70e
Content-Type: application/http
Content-Transfer-Encoding: binary
GET https://fabrikam.sharepoint.com/_api/Web/lists HTTP/1.1
--batch_7ba8d60b-efce-4a2f-b719-60c27cc0e70e--
注意
バッチ リクエストにより、SharePoint RESTAPI へのラウンドトリップ リクエストの数を減らすことができます。 ただし、1 つのバッチで複数のファイルをアップロードすることはサポートされていません。
OData ライブラリ
OData ライブラリは、多くの言語での OData バッチ処理をサポートしています。 次に、2 つの例を示します。 詳細な一覧については、OData ライブラリ参照してください。