【Swift】URLSessionクラスとは?URLRequestとHTTP通信!
この記事からわかること
- SwiftのURLSessionクラスの使い方
- dataTaskメソッドとは?
- API取得やHTTP通信をする方法
- URLRequestクラスとは?
- URLSessionTaskやURLSessionConfigurationの違い
- dataTask(with:completionHandler:)メソッドの使い方
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
URL Loading System
Swiftには「URL Loading System」としてまとめられたHTTPやHTTPSを含むネットワーク通信を実装するための機能を提供するAPIが用意されています。
用意されたAPIを使用することでSwiftで開発したアプリケーションからWebサーバーとHTTP通信(HTTPリクエストを送信し、HTTPレスポンスを受信)を行うことができるようになり、指定したURLからファイルをダウンロードしたり、データをアップロードしたりといったことが可能になります。
また同期的な処理だけでなく、非同期的なネットワーク通信やバックグラウンド通信、セキュリティ認証、キャッシュなどの機能も提供しています。
できること
- HTTPリクエストの作成と送信
- HTTPレスポンスの処理
- ダウンロード/アップロードタスクの管理
- 同期/非同期通信
- バッググラウンド通信
定義されているAPIの中でも代表的なものが以下の3つです。
- URLSessionクラス
- URLSessionTaskクラス
- URLSessionConfigurationクラス
また同じような機能を持ったライブラリとして「Alamofire」があります。
URLSessionクラスとは?
class URLSession : NSObject
URLSessionクラスは関連するネットワークのデータ転送タスクグループ(URLSessionTask)を調整するための機能を提供するクラスです。
URL Loading SystemではURLへのアクセスをタスク(URLSessionTask
)として管理しています。
URLSessionTaskクラス
class URLSessionTask : NSObject
URLSessionTaskクラスはネットワーク通信のタスクを表す抽象クラスです。以下のようなサブクラスが用意されています。
URLSessionTaskのサブクラス
- URLSessionDataTask:HTTP通信
- URLSessionDownloadTask:ダウンロードタスク
- URLSessionUploadTask:アップロードタスク
URLSessionConfigurationクラス
公式リファレンス:URLSessionConfigurationクラス
class URLSessionTask : NSObject
URLSessionConfigurationクラスはセッション構成を定義するためのクラスです。
iOSアプリからURLへアクセスする
実際にSwiftを使用したiOSアプリケーションからURLへアクセスする方法を例に使い方を見てみます。基本的な流れは以下の通りになります。
- URLの構築
- URLRequestの作成
- タスクを生成→実行
- レスポンスを受け取る
- データをデコード
func getDateInfoFromKOYOKMIAPI(completion: @escaping ([String:Any]) -> Void) {
let urlString = "https://appdev-room.com/rokuyou"
guard let url = URL(string: urlString) else {
return
}
// リクエストを構築
let request = URLRequest(url: url)
// URLにアクセスしてレスポンスを取得する
URLSession.shared.dataTask(with: request) { data, response, error in
if let data = data {
do {
let dic = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any]
let dayInfoAPI = dic!["datelist"] as? [String: Any]
completion(dayInfoAPI!)
} catch {
print(error.localizedDescription)
}
} else {
// データが取得できなかった場合の処理
print(error?.localizedDescription ?? "不明なエラー")
}
}.resume()
}
上記の例はWebページ(URL)にアクセスして返されるJSONデータを取得してSwiftで扱いやすい辞書型に変換しています。上記コードの詳細は以下の記事を参照してください。
ここで肝となる部分を見ていきます。
URLRequestクラス
HTTPリクエストはURLRequest
クラスを使って構築します。生成されたリクエストにはHTTPメソッド(postやgetなど)やヘッダーなどのパラメータを付与することができます。
HTTPメソッドを変更する:POST
HTTPメソッドを変更するにはhttpMethod
プロパティにメソッドを文字列型で渡します。デフォルトのHTTP メソッドは「GET」です。
var request = URLRequest(url: url)
request.httpMethod = "POST"
dataTask(with:completionHandler:)メソッド
公式リファレンス:dataTask(with:completionHandler:)メソッド
func dataTask(
with request: URLRequest,
completionHandler: @escaping @Sendable (Data?, URLResponse?, Error?) -> Void
) -> URLSessionDataTask
おすすめ記事:【Swift】completionHandlerとは?使い方と@escapingの意味
URLSessionクラスのdataTask(with:completionHandler:)
メソッドは指定されたURLリクエストオブジェクトに基づいてコンテンツを取得するタスク(URLSessionDataTask)を作成するメソッドです。タスクが実行され完了するとcompletionHandler
からコンテンツ(Data)、レスポンスデータ(URLResponse)、エラー(Error)オブジェクトを取得できます。
作成されたタスクはそのままでは実行されないのでresume
メソッドを呼び出すことでタスクが実行されます。
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。