ush109rockのブログ

主にiOS/Androidの情報を発信していきます。

URLSessionを用いた通信

背景

モバイルアプリ作っていると、APIで外部からデータを引っ張ってきたいと思うことが良くあります。 そういったときにAlamofireなどのサードパティーのライブラリを使いがちで、URLSessionを使ったことがない人がまあまあいると思います。そこでURLSessionを用いた基礎を書いていきます。

必要クラス

URLSession

ダウンロード周りのAPIを提供するクラス。
通信に必要なセッションを生成する。

URLSessionConfiguration

ダウンロードやアップロードする際、必ず設定すべき最初の手順。
バックグラウンド動作の有無や、タイムアウト時間など様々な設定をすることができる。

URLSessionTask

ファイルなどをダウンロードするなどのタスクが、URLSessionによって実行される。
下記のサブクラスによって振る舞いを決定することができる

  • URLSessionDataTask:ダウンロードする(小さいデータ)
  • URLSessionDownloadTask:ダウンロードする(大きなデータ)
  • URLSessionUploadTask:アップロードする

URLRequest

プロトコルまたはURLスキームに依存しないリクエストを行うことができる。
URLRequestを使わない場合GETメソッドでのリクエストしかできないが、 URLRequestを使うとPOSTメソッドでのリクエストを行うことがきる。

使い方

上記のクラスを用いてGETメソッドとPOSTメソッドでリクエストを投げる最小構成を書いていきます。

GETメソッド

class HTTPClient {
    func get() {
        let config: URLSessionConfiguration = URLSessionConfiguration.default
        let session: URLSession = URLSession(configuration: config)
        let url: URL = URL(string: "http://example.com")!
        
        session.dataTask(with: url, completionHandler: { (data, response, error) in
            // do something
        })
    }
}

let client: HTTPClient = HTTPClient()
client.get()

POSTメソッド

class HTTPClient {
    
    func post() {
        let config: URLSessionConfiguration = URLSessionConfiguration.default
        let session: URLSession = URLSession(configuration: config)
        let url: URL = URL(string: "http://example.com/post")!
        var req: URLRequest = URLRequest(url: url)
        req.httpMethod = "POST"
        req.httpBody = "post test".data(using: .utf8)
        
        let task = session.dataTask(with: req, completionHandler: { (data, response, error) in
            // do something
            print(error!)
        })
        task.resume()
    }
}

let client: HTTPClient = HTTPClient()
client.post()

GETでもPOSTでも書き方はほぼ同じで、POSTのときはURLRequestでhttp methodとhttp bodyの指定が必要です。