アドバンスド · ソリューション株式会社 平田貴嗣
前回の「iOSアプリでSharePoint Onlineにサインインする方法」に引き続き、ネイティブのiOSアプリからSharePoint Onlineに対して操作を行う方法を説明します。
■処理の概要
SharePoint Onlineに対して、外部から操作を行う方法の1つとして、RESTサービスを使用する方法があります。RESTサービスは、HTTPリクエストにより操作を実行することのできるAPI(URL)を提供するサービスです。そのため、RESTサービスを使用するために、HTTP通信の知識も必要となります。
また、SharePoint Onlineは、認証(サインイン)が必要なサービスです。RESTで操作を行う際も認証を事前に行っておく必要があり、HTTPリクエストを行う際には必ず、認証(サインイン)した際に取得できる認証トークン(HTTPクッキー)をリクエストヘッダーに設定してからHTTPリクエストを行う必要があります。
REST サービスには、操作ごとに下記のようなREST APIが用意されています。
例)リストを取得するREST API
http://server/site/_api/lists/getbytitle('listname')
また、HTTPリクエストを送信するにあたり、取得(GET)、作成(POST)、更新/追記(PUT)、削除(DELETE)といった要求ごとにHTTPメソッド(HTTPコマンド)を設定する必要があります。
上記の例では、GETを設定します。
参考)SharePoint 2013 REST サービスの概要
https://msdn.microsoft.com/ja-jp/library/office/fp142380.aspx
では、ネイティブのiOSアプリからSharePoint Onlineに対して、RESTで操作を行ってみましょう。
下記に実装方法について、説明します。
■画面の作成
まず画面についてです。
今回は、前回作成したMainViewControllerを変更していきます。
HTTPリクエストを実行し、結果を確認するために、MainViewControllerの画面にHTTPリクエストを実行するUIButtonと、取得結果を表示するUITextViewを配置します。
また、MainViewControllerに対して、これらのOutletとAction(UIButtonのTouchUpInside)を設定します。
■ソースコードの作成
次は、実装するソースコードです。
※iOSアプリからHTTPで通信を行うためには、NSURLSessionクラス、または、NSURLConnectionクラスを使用します。
今回の記事では、NSURLSessionクラスを使用します。
◎実装のポイント
・URL (REST API)を設定する
・HTTPメソッドを設定する
・認証時に取得した認証トークンを、リクエストヘッダーに設定する
実際には、取得結果はJSONやXMLのフォーマットで受け取り、パースして使用します。
また、全角文字をREST APIのパラメーターに含む場合は、URLエンコードを行ってください。
// リクエストの作成
let request = NSMutableURLRequest()
// REST APIの設定
let serverName = "ServerName" // サーバー名
let listName = "ListName" // リスト名
request.URL = NSURL(string: "https://\(serverName)/_api/lists/getbytitle('\(listName)')")
// HTTPメソッドの設定
request.HTTPMethod = "GET" // 取得APIの"GET"を指定
// HTTPヘッダーの設定
let cookies = [self.rtFaCookie, self.fedAuthCookie] // 認証トークン
request.allHTTPHeaderFields = NSHTTPCookie.requestHeaderFieldsWithCookies(cookies)
// リクエスト処理
session.dataTaskWithRequest(request) {
(以降省略)
今回の説明では、リストを取得するためのAPIを使用しましたが、REST APIは操作ごとに様々用意されていますので、下記のリファレンスサイトを参考に是非いろいろと試してみてください。
参考)SharePoint 2013 REST API リファレンス
https://msdn.microsoft.com/ja-jp/library/office/dn593591.aspx
参考)SharePoint REST 要求で OData クエリ操作を使用する
https://msdn.microsoft.com/library/office/fp142385(v=office.15).aspx
最後に、下記はコーディング例になります。
サンプルコード)
//
// MainViewController.swift
//
import UIKit
class MainViewController: UIViewController, SigninDelegate {
/// 取得結果を表示するUITextView
@IBOutlet weak var textView: UITextView!
/// rtFAクッキー
var rtFaCookie: NSHTTPCookie!
/// FedAuthクッキー
var fedAuthCookie: NSHTTPCookie!
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewDidAppear(animated: Bool) {
// 認証情報がない場合はサインイン画面に遷移
if self.rtFaCookie == nil || self.fedAuthCookie == nil {
if let storyboard = self.storyboard {
let signinViewController = storyboard.instantiateViewControllerWithIdentifier("Signin") as SigninViewController
signinViewController.delegate = self
self.presentViewController(signinViewController, animated: false, completion: nil);
}
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
/**
認証結果を受け取るためのメソッド
(SigninViewControllerから呼ばれる)
:param: rtFaCookie rtFAクッキー
:param: fedAuthCookie FedAuthクッキー
*/
func didSignin(#rtFaCookie: NSHTTPCookie, fedAuthCookie: NSHTTPCookie) {
self.rtFaCookie = rtFaCookie
self.fedAuthCookie = fedAuthCookie
}
/**
ボタンがタッチされた場合に呼ばれるアクションメソッド
:param: sender UIButtonのオブジェクト
*/
@IBAction func buttonDidTouchUpInside(sender: AnyObject) {
// セッションの設定
let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
configuration.timeoutIntervalForRequest = 30 // データ間のタイムアウト間隔(秒)
configuration.timeoutIntervalForResource = 60 // 全データ取得までのタイムアウト間隔(秒)
configuration.requestCachePolicy = NSURLRequestCachePolicy.ReloadIgnoringLocalCacheData // ローカルにキャッシュしない
// セッションの作成
let session = NSURLSession(configuration: configuration, delegate: nil, delegateQueue: NSOperationQueue.mainQueue())
// リクエストの作成
let request = NSMutableURLRequest()
// REST APIの設定
let serverName = "ServerName" // サーバー名
let listName = "ListName" // リスト名
request.URL = NSURL(string: "https://\(serverName)/_api/lists/getbytitle('\(listName)')")
// HTTPメソッドの設定
request.HTTPMethod = "GET" // 取得APIの"GET"を指定
// HTTPヘッダーの設定
let cookies = [self.rtFaCookie, self.fedAuthCookie] // 認証トークン
request.allHTTPHeaderFields = NSHTTPCookie.requestHeaderFieldsWithCookies(cookies)
// リクエスト処理
session.dataTaskWithRequest(request) {
[unowned self]
(data: NSData!, response: NSURLResponse!, error: NSError!) in
// 接続エラー発生時
if error != nil {
// エラー処理
println(error.description)
// 結果取得時
} else {
// 取得処理
let text = NSString(data: data, encoding: NSUTF8StringEncoding)
println(text?)
self.textView.text = text
}
// セッションの破棄
session.invalidateAndCancel() // 閉じない場合はメモリーリークを起こす
}.resume()
}
}
以上になります。