はじめに
Alamofireを今までなんとなくつかってたので調べました。
目次
- Alamofireとは?
- 特徴
- 実装例
- おまけ(各メソッド)
- 参考文献
Alamofireとは?
API通信するためのSwiftのライブラリ。
URLSession
など既存のものを使いやすくしたライブラリ。
特徴
公式に書いてある特徴をわかりやすくまとめてみました
-
Chainable Request / Response Methods: リクエストやレスポンスのメソッドを連鎖的(順番)に呼び出せる。
→実装例がわかりやすい例です -
Swift Concurrency Support Back to iOS 13, macOS 10.15, tvOS 13, and watchOS 6: iOS 13やそれ以降のOSでSwiftの非同期処理(Concurrency)がサポートされている。
→要はasync/await
をつかえるよーってこと -
Combine Support: Combineフレームワークを使った非同期処理がサポートされている。
→Combineが使えるよー - URL / JSON Parameter Encoding: URLやJSON形式でのパラメータのエンコードが可能。
- Upload File / Data / Stream / MultipartFormData: ファイルやデータ、ストリーム、マルチパートフォームデータのアップロードをサポート。
- Download File using Request or Resume Data: リクエストを使ったダウンロードや中断したダウンロードの再開が可能。
- Authentication with URLCredential: URLCredentialを使った認証機能。
-
HTTP Response Validation: HTTPレスポンスの検証機能。
→サーバーから返されたデータが正しいかどうかをチェックする機能 - Upload and Download Progress Closures with Progress: アップロードやダウンロードの進捗状況をクロージャで追跡できる。
- cURL Command Output: リクエストをcURLコマンドとして出力可能。
- Dynamically Adapt and Retry Requests: リクエストを動的に適応させたり、再試行する機能。
- TLS Certificate and Public Key Pinning: TLS証明書や公開鍵のピンニングをサポート。
- Network Reachability: ネットワークの到達可能性のチェック機能。
- Comprehensive Unit and Integration Test Coverage: ユニットテストや統合テストが包括的にサポートされている。
- Complete Documentation: 完全なドキュメントが提供されている。
実装例
Alamofireを使ったAPI通信
import Alamofire
// Alamofireを使ってAPIからデータを取得する
func fetchDataWithAlamofire(pokeName: String) {
// リクエストURLを指定(今回適当に書いてます)
let url = "https://pokeapi.co/api/v2/pokemon/\(pokeName)"
// Alamofireリクエストを作成
AF.request(url, method: .get)
.validate() // レスポンスの検証
.responseJSON { response in
switch response.result {
case .success(let json):
// データの処理
print("Response JSON:", json)
case .failure(let error):
// エラーハンドリング
print("Error:", error)
}
}
}
めっちゃシンプルですね!URLSession
を使って書いてたらエラー処理など長々と書く必要があるのでかなりありがたいですね!
詳細を書いていきます。
-
AF
Alamofire
の略(夜のお店などではありません)。Alamofireの機能がたくさん詰まってるそうです(はなほじ) -
request(url, method: .get)
直感的にurl
(エンドポイント)にGET
でリクエストを飛ばすよってこと -
validate()
データを取ってこれたかどうか判断 -
responseJSON
データがJSON形式で返ってきたら、そのデータを教えてね」という命令です。返ってきたJSONデータを見て、どう処理するか決めます。
Switch文でレスポンスの内容が正常であったら返ってきたレスポンスをprintし、エラーがあったらエラーをprint
AF.したい処理
を
連鎖的,つまり連続して書いていくんですね
おまけ
公式ドキュメントにある
let response = await AF.request("https://httpbin.org/get", interceptor: .retryPolicy)
// Automatic HTTP Basic Auth.
.authenticate(username: "user", password: "pass")
// Caching customization.
.cacheResponse(using: .cache)
// Redirect customization.
.redirect(using: .follow)
// Validate response code and Content-Type.
.validate()
// Produce a cURL command for the request.
.cURLDescription { description in
print(description)
}
// Automatic Decodable support with background parsing.
.serializingDecodable(DecodableType.self)
// Await the full response with metrics and a parsed body.
.response
// Detailed response description for easy debugging.
debugPrint(response)
の各メソッドについて軽く紹介しておきます(自分も理解深めたい)
-
authenticate(username: "user", password: "pass")
Basic認証かかってるAPIにリクエストを飛ばすときにusername
とpassword
を設定して使う -
cacheResponse(using: .cache)
このデータをcashe
として保存して次回も使えるようにしてねって記述 -
redirect(using: .follow)
APIから返されたデータが別の場所に移動したときに、どうするかを決める
この例だと「データの場所が変わったときは、自動で新しい場所に移動してね」
ってこと -
cURLDescription { description in print(description) }:
cURLDescriptionは、APIリクエストをcURLコマンドとして表示し、リクエストの詳細をチェック -
serializingDecodable(DecodableType.self)
デコードしたいとき
追記
responseJSON
だと以下の警告が出ます。
responseJSON(queue:dataPreprocessor:emptyResponseCodes:emptyRequestMethods:options:completionHandler:)' is deprecated: responseJSON deprecated and will be removed in Alamofire 6. Use responseDecodable instead
これはresponseJSON
が非推奨なのでresponseDecodable
を使えよということです。
(Alamofire6からresponseJSON
が削除されるみたいですね。)
-
responseJSON
: JSON型のデータを受け取る -
responseDecodable
デコードされたデータを受け取る
なので利便性もふくめてresponseDecodable
に慣れておいた方がいいですね。
ちなみに警告消したいだけならresponseJSON
をresponseData
に書き換えればいけます
cURLとは...
- cURLは、インターネットでデータを送ったり受け取ったりするためのコマンドです