【Swift】Alamofireの導入と使い方!HTTP通信とAPI

この記事からわかること
- SwiftのAlamofireの導入方法
- HTTP通信のやり方
- APIを操作するには?
- AFやSessionクラスの使い方
index
[open]
\ アプリをリリースしました /
Alamofireとは?

AlamofireとはSwiftで使用されるHTTPネットワーキングライブラリです。ネットワーク通信に関わるリクエスト/レスポンス処理だけでなく、ファイルのアップロード、非同期処理、JSONパラメータのエンコーディング、認証機能などさまざまな特徴を持っています。
アプリでの使い所としてはAPI通信(Qiitaの記事やGitHubのリポジトリの取得)などによく活用されています。
ちなみにAlamofireでアラモファイアと読み、言葉の由来はテキサス州の公式州花になっている花の名前のようです。
Alamo Fire Lupinus texensis (マメ科)
APIとは?
そもそもAPIとは「Application Programming Interface」の略称でアプリやプログラム、Webサービス同士を繋ぐインターフェースのことを指します。
サービス同士を繋ぐ形で提供されているものはAPIと呼ばれますが今回はWeb上からJSON形式でデータを受け取り、アプリ内で参照するために使用するようなAPIを使用していきます。
Xcodeでの導入
Alamofireは普通のライブラリ同様にCocoaPodsやSwift Package Managerなどのツールを利用してXcodeに導入することが可能です。
CocoaPods
pod 'Alamofire'
Swift Package Manager
https://github.com/Alamofire/Alamofire.git

Xcodeにライブラリを導入できたら使用するファイルの上部でimport
しておきます。
import Alamofire
APIの取得方法
では実際にHTTPリクエストを送信し、APIからデータを取得してみます。今回は当サイト「Webエンジニア学習部屋」の記事を全て取得するAPIにアクセスしてみたいと思います。
上記のURLを叩いて取得できるのはJSON形式の文字の羅列です。これを任意の形に変換することでアプリ内から操作しやすいようにしていけばOKです。今回の変換部分はAlamofireとは関係ないので通信部分に焦点を当てて実装してみます。
import SwiftUI
import Alamofire
struct AlamofireView: View {
func getArticles(){
AF.request("https://tech.amefure.com/api/article").response { response in
do {
let articles = try JSONSerialization.jsonObject(with: response.data!, options: []) as? Array<Any>
print(articles)
} catch {
print(error.localizedDescription)
}
}
}
var body: some View {
Button {
getArticles()
} label: {
Text("get")
}
}
}
AlamofireでのHTTP通信
実際に通信部分を行っているのが以下の部分です。AlamofireではAF.request()
でリクエストを送信しています。response
からそのレスポンスに参照することが可能です。
AF.request("https://tech.amefure.com/api/article").response { response in
//
}
AF(Session.default)
AF
の定義を見てみると実態はSession
クラスのようです。default
プロパティはシングルトンになるようにSessionインスタンスが格納されています。
public let AF = Session.default
open class Session {
/// Shared singleton instance used by all `AF.request` APIs. Cannot be modified.
public static let `default` = Session()
}
requestメソッド
実際にリクエストを送信したのはrequest
メソッドです。これはSession
クラスに定義されているメソッドで引数にURLやHTTPメソッド、パラメータを渡すことで任意のリクエストを送信することが可能になっています。
open class Session {
open func request(_ convertible: URLConvertible,
method: HTTPMethod = .get,
parameters: Parameters? = nil,
encoding: ParameterEncoding = URLEncoding.default,
headers: HTTPHeaders? = nil,
interceptor: RequestInterceptor? = nil,
requestModifier: RequestModifier? = nil) -> DataRequest {
let convertible = RequestConvertible(url: convertible,
method: method,
parameters: parameters,
encoding: encoding,
headers: headers,
requestModifier: requestModifier)
return request(convertible, interceptor: interceptor)
}
}
使用例
let url = "http://www.xxx.com/api"
AF.request(url, method: .get, parameters: params).response { response in }
JSON形式のデコーティング
取得したJSON形式のデータは必要に応じてSwiftで扱いやすいデータ型に変換します。先ほどはJSONSerialization
クラスを使用して配列型に変換することで出力していました。
let articles = try JSONSerialization.jsonObject(with: response.data!, options: []) as? Array<Any>
構造体(クラス)に変換する
辞書型ではなく、構造体(orクラス)に変換するにはJSONDecoderクラス
を利用します。詳細は以下の記事を参考にしてください。
構造体に変換するポイント
- モデルの作成
- デコード
変換対象となるモデル構造体(orクラス)を先に定義しておきます。
モデル構造体の作成
struct Article: Decodable{
let id:Int
let title:String
}
JSONDecoderクラスによる変換
AF.request("https://tech.amefure.com/api/article")
.responseData { response in
do {
let decoder: JSONDecoder = JSONDecoder()
let articles: [Article] = try decoder.decode([Article].self, from: response.data!)
print(articles)
} catch {
print(error.localizedDescription)
}
}
SwiftオリジナルのHTTP通信クラス
ライブラリではなくSwiftに既に組み込まれているURLSessionクラスでもHTTP通信が可能になっています。
Alamofire
を使用した処理もURLSessionクラスを用いて以下のように記述することも可能です。
func getArticleAPI() {
let urlString = "https://tech.amefure.com/api/article"
// 有効なURLかをチェック
if validationUrl(urlString: urlString) == false {
return
}
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 articles = try JSONSerialization.jsonObject(with: data, options: []) as? Array<Any>
print(articles)
} catch {
print(error.localizedDescription)
}
}
}.resume()
}
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。
個人開発に限界を感じたらiOSに特化したプログラミングスクール「iOSアカデミア」も検討してみてください!無料相談可能で「最短・最速」でiOSエンジニアになれるように手助けしてくれます。