SwiftでiOSアプリからHTTP POSTリクエストを送信する方法【URLSession完全解説】
iOSアプリでHTTPリクエストを送信するには、URLSessionのdataTaskを利用します。基本的な流れとしては、設定(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リクエストから実装してみてください。
-
SwiftでRealmデータベースをiOSアプリに導入する方法|CRUD操作を学べるToDoアプリ開発ガイド
こんにちは!この記事では、RealmデータベースをiOSアプリに追加する方法を解説します。シンプルなToDoアプリを作りながら、RealmデータベースにおけるCRUD(Create=作成、Read=読み取り、Update=更新、Delete=削除)操作の実装方法を学んでいきましょう。Realmとは?Realmは、開発者にとって扱いやすく使い勝手の良いオープンソースのモバイル向けデータベースです。iOSアプリではCore Dataの代替として利用することもできます。Realmはクロスプラットフォーム対応のモバイルデータベースです。そのため、ネイティブのAndroid・iOSアプリはもちろん、Re
-
予算ゼロでOK!Macの無料ツールだけでApp StoreにふさわしいiOSアプリプレビュー動画を作る方法
はじめに 2014年、AppleはApp Storeに「アプリプレビュー」動画を追加できるようにしました。アプリプレビューは、ダウンロード前にアプリの魅力を潜在ユーザーへ伝えるための最も効果的な手段です。StoreMavenの調査によると、プレビュー動画があるアプリは、ないアプリに比べて約3倍インストールされやすいことが分かっています。 しかし、個人開発者の多くは、プロに制作を依頼する予算がないのが現実です。筆者も最近同じ状況に陥りましたが、調べてみると、無料ツールだけでも高品質なアプリプレビューを作れることが判明しました。 本記事では、以下の流れで順番に解説していきます。 コンテンツの準備