この記事は2018年07月01日に投稿しました。
この記事は2018年08月04日に更新しました。
目次
本気ではじめるiPhoneアプリ作り Xcode 9.x+Swift 4.x対応 (「ヤフー黒帯」シリーズ)
- 作者: 西磨翁
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2017/12/14
- メディア: 単行本
- この商品を含むブログを見る
1. はじめに
こんにちは、iOSのエディタアプリPWEditorの開発者の二俣です。
OneDrive APIでディレクトリを作成してみます。
ファイルの作成同様、ディレクトリ作成のAPIが見つからなかったので、OneDriveのREST APIを使ってディレクトリを作成します。
2. ディレクトリ作成処理
手順としてはファイルの作成と同じになります。
違う点としては次に4点になります。
- URL文字列が異なる。
- HTTPリクエストヘッダのContentTypeが異なる。
- HTTPパラメータの設定が必要
- HTTPメソッドが異なる。
ファイルの作成とディレクトリの作成で、"1. URL文字列"が異なるのは当然だと思います。
しかしディレクトリの作成の場合、"3. HTTPパラメータの設定"が必要となり、それに合わせて"2. HTTPリクエストヘッダのContentType"と"4. HTTPメソッド"も変更になります。
import OneDriveSDK /** ディレクトリを作成します。 - Parameter parentId: 親ディレクトリのID - Parameter dirName: ディレクトリ名 */ func createDir(_ parentId: String, dirName: String) { // 認証済みクライアントオブジェクトを取得します。 guard let client = ODClient.loadCurrent() else { // 認証済みクライアントオブジェクトが取得できない場合、処理を終了します。 // 念のためのチェックです。 // 必要に応じてエラー処理を行ってください。 return } // ベースURLを取得します。 guard let baseURL = client.baseURL else { // ベースURLが取得できない場合、処理を終了します。 // 必要に応じてエラー処理を行ってください。 return } // アクセストークンを取得する。 guard let accountSession = client.authProvider.accountSession?() else { // アカウントセッションが取得できない場合、処理を終了します。 // 必要に応じてエラー処理を行ってください。 return } // アクセストークンを取得します。 guard let accessToken = accountSession.accessToken else { // アクセストークンが取得できない場合、処理を終了します。 // 必要に応じてエラー処理を行ってください。 return } // URL文字列を生成します。 let urlString = "\(baseURL)/drive/items/\(parentId)/children" // URLを生成します。 guard let url = URL(string: urlString) else { // URLが生成できない場合、処理を終了します。 // 必要に応じてエラー処理を行ってください。 return } // HTTPリクエストを生成します。 let request = NSMutableURLRequest(url: url) // キャッシュをオフにします。 request.cachePolicy = .reloadIgnoringLocalCacheData // HTTPメソッドを設定します。 // 今回は"POST"を使用します。 request.httpMethod = "POST" // Content-Typeを設定します。 // HTTPパラメータを設定するため、"Content-Type"に"application/json"を設定します。 request.setValue("application/json", forHTTPHeaderField: "Content-Type") // Authorizationを設定します。 // ここでアクセストークンを設定します。 let bearer = String(format: "Bearer %@", accessToken) request.setValue(bearer, forHTTPHeaderField: "Authorization") // HTTPパラメータを生成し、設定します。 let emptyParams = Dictionary<String, String>() let params = ["name": dirName, "folder": emptyParams, "@name.conflictBehavior": "rename"] as [String : Any] do { request.httpBody = try JSONSerialization.data(withJSONObject: params, options: JSONSerialization.WritingOptions()) } catch { // HTTPパラメータの設定でエラーの場合、処理を終了します。 // 必要に応じてエラー処理を行ってください。 return } // HTTP通信タスクを生成します。 let task = URLSession.shared.dataTask(with: request as URLRequest, completionHandler: { (data: Data?, response: URLResponse?, error: Error?) -> Void in if let error = error { // エラーの場合、処理を終了します。 // 必要に応じてエラー処理を行ってください。 return } // HTTPステータスコードを取得します。 guard let httpURLResponse = response as? HTTPURLResponse else { // HTTPステータスコードが取得できない場合、処理を終了します。 // 必要に応じてエラー処理を行ってください。 return } let statusCode = httpURLResponse.statusCode // HTTPステータスコード別に処理を振り分けます。 switch statusCode { case 200, 201: // 正常終了の場合、正常時に行う処理を記述してください。 break default: // 上記以外のHTTPステータスコードはエラーとして、処理を終了します。 // 必要に応じてエラー処理を行ってください。 break } }) // HTTP通信タスクを実行します。 task.resume() }
3. おわりに
今思えばファイル作成のメソッドと手順は同じなので、うまく差異を切り出せば処理を共通化できると思います。
しかし当時は、うまく動作しなくて試行錯誤しながら実装したので、ファイル作成のメソッドとは分けることにしました。
特にHTTPパラメータの設定方法がわからず苦労しました。
機会があればリファクタリングしたいところです。
転職を本気で考えている方向けのプログラミングスクール!【WebCampPRO】
[改訂新版]Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 (WEB+DB PRESS plus)
- 作者: 石川洋資,西山勇世
- 出版社/メーカー: 技術評論社
- 発売日: 2018/01/17
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
紹介している一部の記事のコードはGitlabで公開しています。
興味のある方は覗いてみてください。
私が勤務しているニューラルでは、主に組み込み系ソフトの開発を行っております。
弊社製品のハイブリッドOS Bi-OSは高い技術力を評価されており、特に制御系や通信系を得意としています。
私自身はiOSモバイルアプリやウィンドウズアプリを得意としております。
ソフトウェア開発に関して相談などございましたら、お気軽にご連絡ください。
また一緒に働きたい技術者の方も随時募集中です。
興味がありましたらご連絡ください。
EMAIL : info-nr@newral.co.jp / m-futamata@newral.co.jp
TEL : 042-523-3663
FAX : 042-540-1688