簡単にSwiftでRailsと連携する方法

  • 48
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

Swiftをはじめて1ヶ月あたりでアプリを作ってみた。
その中でどうせならRailsと連携してDBを使いたかったので、導入してみたときの記録。

今回はHTTP通信部分(GET・POST)の記述のみを簡単に紹介。

ちなみにRailsはscaffoldでさくっと作成。
.json.jbuilderのひな形みたいなのも作ってくれたのでよかった。

データ受信(GET)

Swift側

ViewController/HomeTableViewController.swift

func loadDiaries() {
        let url = NSURL(string: "http://localhost:4000/diaries.json")
        var request = NSMutableURLRequest(URL: url!)

        request.HTTPMethod = "GET"

        var task = NSURLSession.sharedSession().dataTaskWithRequest(request, completionHandler: { (data, responce, error) -> Void in

            if (error == nil) {
                self.diaries.removeAll(keepCapacity: false)
                var diaries = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as! Array<Dictionary<String, AnyObject>>

                for diaryInfo in diaries {
                    let diary = Diary(attributes: diaryInfo)
                    self.diaries.append(diary)
                }
                dispatch_async(dispatch_get_main_queue(), { () -> Void in
                    self.tableView.reloadData()
                })
            } else {
                // when error
            }
        })
        task.resume()
    }

Rails側

views/diaries/index.json.jbuilder

json.array!(@diaries) do |diary|
  json.extract! diary, :id, :name, :title, :text, :created_at
  json.url diary_url(diary, format: :json)
end

データ送信(POST)

簡単にいうと、
配列にデータをいれて、URLとHTTPメソッドを指定して送るだけ。

Swift側

ViewController/NewDiaryViewController.swift

func save() {
        var url = NSURL(string: "http://localhost:4000/diaries")
        var request = NSMutableURLRequest(URL: url!)

        request.HTTPMethod = "POST"

        request.addValue("application/json", forHTTPHeaderField: "Content-Type")

        var params: [String: AnyObject] = [
            "name": "ただち",
            "title": titleField.text,
            "text": textField.text
        ]

        request.HTTPBody = NSJSONSerialization.dataWithJSONObject(params, options: nil, error: nil)

        var task = NSURLSession.sharedSession().dataTaskWithRequest(request, completionHandler: { (data, response, error) -> Void in
            if (error == nil) {
                var result = NSString(data: data, encoding: NSUTF8StringEncoding)!
            }
        })
        task.resume()
        close()
    }

保存ボタンを押したときこのメソッドが走るように設定。

Rails側にSwift用の記述はしなくて大丈夫です。

その他

プロジェクトは以下。
https://github.com/yuta-t/today

制作期間2日くらい。