iOS
 Computer >> コンピューター >  >> プログラミング >> iOS

SwiftでiOSアプリからHTTP POSTリクエストを送信する方法【URLSession完全解説】

iOSアプリでHTTPリクエストを送信するには、URLSessiondataTaskを利用します。基本的な流れとしては、設定(Configuration)、セッション、URL、リクエスト、そしてdataTaskという各オブジェクトを順番に作成していきます。

この記事では、POSTリクエストを例に、実際のコードを使いながら手順を段階的に解説します。

手順1:セッションオブジェクトを作成する

まず最初に行うのは、デフォルト設定を持つセッションオブジェクトの作成です。URLSessionConfiguration.defaultを使えば、標準的な通信設定を簡単に利用できます。

let configuration = URLSessionConfiguration.default
let session = URLSession(configuration: configuration)

手順2:URLRequestオブジェクトを作成する

次に、目的に応じた種類のURLRequestを作成します。HTTPメソッドにはGET、POST、DELETE、PUTなどがあり、この記事ではPOSTタイプを扱います。

また、JSON形式でデータを送受信するため、ヘッダーにapplication/jsonを指定しておきましょう。

let url = URL(string: URLString)
//let url = NSURL(string: urlString as String)
var request : URLRequest = URLRequest(url: url!)
request.httpMethod = "POST"
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("application/json", forHTTPHeaderField: "Accept")

手順3:dataTaskを実行する

リクエストオブジェクトが作成できたら、そのURLに対してdataTaskを実行します。レスポンスを受け取ったら、ステータスコードごとに処理を分岐させるのがポイントです。

以下が、dataTaskメソッド全体の完成形です。

let dataTask = session.dataTask(with: url!) { data,response,error in
    guard let httpResponse = response as? HTTPURLResponse, let receivedData = data
    else {
        print("error: not a valid http response")
        return
    }
    switch (httpResponse.statusCode) {
        case 200: //成功レスポンス
            break
        case 400:
            break
        default:
            break
    }
}
dataTask.resume()

なお、dataTaskは作成しただけでは実行されないため、必ず最後にresume()を呼び出す必要があります。これは初心者が見落としがちな重要なポイントです。

手順4:関数としてまとめて再利用する

ここまでのコードをひとつの関数にまとめれば、プロジェクト内のどこからでも簡単にAPIを呼び出せるようになります。

func hitAPI(_for URLString:String) {
    let configuration = URLSessionConfiguration.default
    let session = URLSession(configuration: configuration)
    let url = URL(string: URLString)
    //let url = NSURL(string: urlString as String)
    var request : URLRequest = URLRequest(url: url!)
    request.httpMethod = "POST"
    request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    request.addValue("application/json", forHTTPHeaderField: "Accept")
    let dataTask = session.dataTask(with: url!) {
        data,response,error in
        // HTTPレスポンスが有効かどうかをチェック
        guard let httpResponse = response as? HTTPURLResponse, let receivedData = data
        else {
            print("error: not a valid http response")
            return
        }
        switch (httpResponse.statusCode) {
            case 200:
                //成功レスポンス
                break
            case 400:
                break
            default:
                break
        }
    }
    dataTask.resume()
}

注意点:App Transport Security(ATS)について

注意: 一部のAPIにアクセスするには、Info.plistファイルでトランスポートセキュリティ(ATS)の例外設定を許可する必要がある場合があります。特にhttp通信(SSL/TLSで暗号化されていない通信)を利用する際には、NSAppTransportSecurityキーとNSAllowsArbitraryLoadsを設定する必要がありますので覚えておきましょう。

まとめ

このサンプルコードは、実際にデータを送信するAPIが必要となるため、単体では出力結果が表示されません。動作確認を行う場合は、テスト用のAPIサーバーやモックサーバーを用意して試してみてください。

URLSessionのdataTaskを使いこなせば、iOSアプリからのネットワーク通信を柔軟に制御できるようになります。まずは本記事の手順を参考に、シンプルなPOSTリクエストから実装してみてください。

  1. SwiftでRealmデータベースをiOSアプリに導入する方法|CRUD操作を学べるToDoアプリ開発ガイド

    こんにちは!この記事では、RealmデータベースをiOSアプリに追加する方法を解説します。シンプルなToDoアプリを作りながら、RealmデータベースにおけるCRUD(Create=作成、Read=読み取り、Update=更新、Delete=削除)操作の実装方法を学んでいきましょう。Realmとは?Realmは、開発者にとって扱いやすく使い勝手の良いオープンソースのモバイル向けデータベースです。iOSアプリではCore Dataの代替として利用することもできます。Realmはクロスプラットフォーム対応のモバイルデータベースです。そのため、ネイティブのAndroid・iOSアプリはもちろん、Re

  2. 予算ゼロでOK!Macの無料ツールだけでApp StoreにふさわしいiOSアプリプレビュー動画を作る方法

    はじめに 2014年、AppleはApp Storeに「アプリプレビュー」動画を追加できるようにしました。アプリプレビューは、ダウンロード前にアプリの魅力を潜在ユーザーへ伝えるための最も効果的な手段です。StoreMavenの調査によると、プレビュー動画があるアプリは、ないアプリに比べて約3倍インストールされやすいことが分かっています。 しかし、個人開発者の多くは、プロに制作を依頼する予算がないのが現実です。筆者も最近同じ状況に陥りましたが、調べてみると、無料ツールだけでも高品質なアプリプレビューを作れることが判明しました。 本記事では、以下の流れで順番に解説していきます。 コンテンツの準備