iOSアプリから独自のWEBサービスを経由してSharePointにアクセスする

アドバンスド · ソリューション株式会社 平田貴嗣


前回は「iOSアプリでSharePoint Onlineに対してRESTで操作を行う方法」で、SharePointのRESTサービスを利用して、SharePointの操作を行いました。

SharePointのRESTサービスを使用する以外の方法でもiOSアプリでSharePointを操作することはできます。iOSアプリからSharePointに直接つなぐのではなく、WEBサービスを間に挟み、WEBサービスが間接的にSharePointを操作するという方法です。

    iOSアプリとWEBサービス.png

 

 

この方法を使用すると、下記のメリットがあります。

・1リクエストで複合的な操作が可能。

 (例えば、テキストと画像のマルチパートリクエストでブログ記事を投稿し、投稿されたことをユーザー各位に独自フォーマットでメール通知、投稿ログをサーバーのイベントログとして保存するなど)

・実装の方法によっては、SharePointがクラウドでもオンプレミスでも、またどのSharePointに接続するか、iOSアプリからは接続先を意識することなくSharePointにアクセスすることができる。

 (例えば、後で検証環境と開発環境を切り替えることもOK)

・WEBサービスが操作を仲介することによって、iOSアプリ、延いてはインターネット上から操作できることを限定できる。

 

特に、業務で使用するともなれば、操作が簡単、操作ステップを少なく、業務に則したきめ細やかな対応といった部分が求められてきます。WEBサービス側で処理を担うことにより、これらに柔軟に対応することが可能となります。

 

では、実装方法を説明していきます。

 

■処理の概要

今回は、WEBサービス側はASP.NET Web APIを使用して、C#での実装を前提として説明していきます。

WEBサービスを.NET Frameworkを使用して実装することで、CSOM(クライアントサイドオブジェクトモデル)、及び、SSOM(サーバーサイドオブジェクトモデル)といったSharePointのAPI(クラスライブラリ)を利用することができます。

 

●[方法] SharePoint 2013 のクライアント ライブラリ コードを使用して基本的な操作を完了する

https://msdn.microsoft.com/ja-jp/library/office/fp179912.aspx

 

●SharePoint 2013: .NET Server、CSOM、JSOM、および REST の API インデックス

https://msdn.microsoft.com/ja-jp/library/office/dn268594.aspx

 

 

また、処理は下記の流れで行います。

 

1)iOSアプリ(WEBサービスに対して各種操作のリクエスト)

  

2)WEBサービス (iOSアプリからの操作のリクエストに対する各種処理)

  ↓

3)SharePoint (WEBサービスからの処理命令を受けての各種処理)

 

 

■WEBサービスの実装

Visual Studio 2013で、ASP.NETプロジェクトの Web APIをテンプレートとして作成していきます。

Web APIテンプレートを使用すると、独自のREST APIを簡単に作成することができます。

 WebAPIテンプレート.png

 

プロジェクトを作成しましたら、次にコーディングを行っていきます。

今回は、ディスカッション掲示板に対して操作を行うコントローラーを想定してREST APIを考えていきます。

下記は、

  POST /sites/{siteId}/discussions

というディスカッション掲示板にディスカッションを作成するREST APIの実装を想定しています。

マルチパートで送信されてきたディスカッションの投稿情報と添付する画像などのファイルをSharePointに保存し、最後にアクセスログをWEBサーバーに残します。

下記のように、WEBサービスでワンクッション受けることにより、複合的で柔軟な対応が可能になります。

 

例)

/// <summary>

/// ディスカッションコントローラークラス

/// </summary>

[RoutePrefix("sites/{siteId}")]

public class DiscussionsController : ApiController

{

   /// <summary>

   /// ディスカッションを作成する

   /// </summary>

   /// <param name="siteId">サイトID</param>

   /// <returns>HttpResponseMessageオブジェクト</returns>

   [Route("discussions")]

   public async Task<HttpResponseMessage> Post(Guid siteId)

   {

      (リクエスト内容のチェック)

 

      // リクエストデータの読み取り

      var provider = await Request.Content.ReadAsMultipartAsync();

 

      byte[] document = null;

      foreach (var content in provider.Contents)

      {

     // iOSからのリクエスト内容を解析してSharePointに投稿する

         switch (content.Headers.ContentDisposition.Name.Trim('\"'))

         {

            case "discussion":

               var json = HttpUtility.UrlDecode(await content.ReadAsStringAsync());

 

               if (json != null)

               {

                  (ディスカッションデータを受け取り、SharePointのディスカッション掲示板に投稿)

               }

               break;

 

            case "attachment":

               attachment = await content.ReadAsByteArrayAsync();

 

                     (添付ファイルを受け取り、SharePointのドキュメントライブラリに保存)

 

               break;

            }

         }

 

          (ディスカッションを新規作成後、サーバーにアクセスログを保存)

 

                以降省略

 

 

■iOSアプリの実装

次にiOSアプリ側になります。

iOSアプリは、SharePointとは直接やり取りを行いませんので、先ほど作成したWEBサービスが提供するREST APIを通して、SharePointにアクセスすることになります。

 

実装方法は、前回説明したSharePointのREST APIを使用する場合と同様にHTTP通信を使用してWEBサービスとやり取りを行います。

HTTPリクエストを送信する先が、SharePointではなく、WEBサービスになるだけです。

 

■最後に

このように、独自のREST APIをWEBサービスで提供することにより、1リクエストで、柔軟にSharePointに対する操作+αの操作を行うことができるようになります。

(認証処理も含め)必要な操作をすべてWEBサービス側でREST APIとして用意することにはなりますが、より柔軟な対応を行う必要がある場合は、選択肢の1つとして考えても良いかと思います。