【Swift】URLSessionクラスとは?URLRequestとHTTP通信!

この記事からわかること

  • SwiftURLSessionクラス使い方
  • dataTaskメソッドとは?
  • API取得HTTP通信をする方法
  • URLRequestクラスとは?
  • URLSessionTaskURLSessionConfiguration違い
  • dataTask(with:completionHandler:)メソッドの使い方

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

公式リファレンス:URL Loading System

URL Loading System

Swiftには「URL Loading System」としてまとめられたHTTPやHTTPSを含むネットワーク通信を実装するための機能を提供するAPIが用意されています。

用意されたAPIを使用することでSwiftで開発したアプリケーションからWebサーバーとHTTP通信(HTTPリクエストを送信し、HTTPレスポンスを受信)を行うことができるようになり、指定したURLからファイルをダウンロードしたり、データをアップロードしたりといったことが可能になります。

また同期的な処理だけでなく、非同期的なネットワーク通信やバックグラウンド通信、セキュリティ認証、キャッシュなどの機能も提供しています。

できること

  1. HTTPリクエストの作成と送信
  2. HTTPレスポンスの処理
  3. ダウンロード/アップロードタスクの管理
  4. 同期/非同期通信
  5. バッググラウンド通信

定義されているAPIの中でも代表的なものが以下の3つです。

  1. URLSessionクラス
  2. URLSessionTaskクラス
  3. URLSessionConfigurationクラス

また同じような機能を持ったライブラリとして「Alamofire」があります。

URLSessionクラスとは?

公式リファレンス:URLSessionクラス

class URLSession : NSObject

URLSessionクラスは関連するネットワークのデータ転送タスクグループ(URLSessionTask)を調整するための機能を提供するクラスです。

URL Loading SystemではURLへのアクセスをタスク(URLSessionTask)として管理しています。

URLSessionTaskクラス

公式リファレンス:URLSessionTaskクラス

class URLSessionTask : NSObject

URLSessionTaskクラスはネットワーク通信のタスクを表す抽象クラスです。以下のようなサブクラスが用意されています。

URLSessionTaskのサブクラス

  1. URLSessionDataTask:HTTP通信
  2. URLSessionDownloadTask:ダウンロードタスク
  3. URLSessionUploadTask:アップロードタスク

URLSessionConfigurationクラス

公式リファレンス:URLSessionConfigurationクラス

class URLSessionTask : NSObject

URLSessionConfigurationクラスはセッション構成を定義するためのクラスです。

iOSアプリからURLへアクセスする

実際にSwiftを使用したiOSアプリケーションからURLへアクセスする方法を例に使い方を見てみます。基本的な流れは以下の通りになります。

  1. URLの構築
  2. URLRequestの作成
  3. タスクを生成→実行
  4. レスポンスを受け取る
  5. データをデコード
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クラス

公式リファレンス: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メソッドを呼び出すことでタスクが実行されます。

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index