Table of Contents
アラモファイヤーの始まり
AlamofireをiOSプロジェクトに統合し始めるには、Swift Package Manager、CocoaPods、Carthageを使ってライブラリを追加できます。Swift Package ManagerはXcodeに組み込まれているので、推奨されるアプローチです。 File] → にナビゲートして、リポジトリURLを追加し、必要に応じてをに置き換える]、[FLT:]ファイル[FLT:]]と]を追加し、または[FLT:[FLT:]を変換]オプションで、任意のネットワークを[FLT]、[FLT:[FLT:[F]、[FLT:[FLT:[F]と[F]、[F]、[FLT:[F]、[F]、[F]、[FLT:[F]、[F]、[F]、[F]、[F]、[F]、[F]、[F]、[F]、[F]、[F]、[FLT:[F]、[FLT:[F]、[F]、[F]、[
import Alamofire
Alamofireのエイリアスは、すべての一般的なHTTP操作に便利なエントリポイントを提供します。 フードの下に、Appleのを使用しますが、キュー管理、パラメータエンコーディング、および応答検証のようなボイラープレートを抽象化します。 これは、配管をネットワーク化するのではなく、ビジネスロジックに焦点を当てることができます。 基礎的なネットワークレイヤーの詳細については、 ]]]を参照してください。 AppleのURLSessionドキュメンテーションF]を参照してください。
GETリクエストの実行
RESTful エンドポイントからデータを取得することは最も一般的な操作です。 Alamofire は GET リクエストを簡潔で読みやすくします。 次の例では、仮説 API からユーザーのリストを取得します。
AF.request("https://api.example.com/users")
.validate()
.responseDecodable(of: [User].self) { response in
switch response.result {
case .success(let users):
print("Fetched \(users.count) users")
case .failure(let error):
print("Request failed with error: \(error)")
}
}
Swiftのプロトコルを活用してモデルオブジェクトにJSONを自動的に解析するの使用に注目。に従う[]の指示を定義する。この方法は、マニュアルJSONシリアライズを排除し、タイプ安全を改善します。
クエリパラメータとヘッダを追加する
多くのREST API は、クエリパラメータやカスタム HTTP ヘッダーを必要とします。Alamofire は、GET リクエストに対して自動的にエンコーディングを処理し、パラメータを GET リクエスト (パラメータは URL に付加されます) として自動的に処理します。ヘッダーは ] パラメータで追加されます。
let parameters: Parameters = ["page": 1, "limit": 20]
let headers: HTTPHeaders = [
"Authorization": "Bearer YOUR_TOKEN",
"Accept": "application/json"
]
AF.request("https://api.example.com/users",
parameters: parameters,
headers: headers)
.validate()
.responseDecodable(of: [User].self) { response in
// handle response
}
Alamofire は、パラメータを自動的に URL をエンコードし、リクエスト URL に添付します。カスタムエンコーディングの場合は、 などの明示的な インスタンスを指定できます。
応答の検証
[ メソッドは、200~299 の範囲で HTTP ステータスコードを自動的にチェックし、非受容可能なコンテンツタイプで応答を拒否します。カスタム検証基準も追加できます。例えば、200 と 201 のステータスコードのみを受け入れることができます。
.validate(statusCode: [200, 201])
バリデーションの失敗は、レスポンスハンドラのエラーとして報告され、アプリケーション全体で一貫したエラー処理を実行できます。
POSTデータ送信
リソースの作成または更新は、通常、リクエストボディでPOSTリクエストが必要です。Alamofireは、REST APIの最も一般的なで複数のエンコーディング戦略をサポートしています。次の例では、新しいユーザーオブジェクトをサーバーに送信します。
let newUser: [String: Any] = [
"name": "Jane Doe",
"email": "[email protected]"
]
AF.request("https://api.example.com/users",
method: .post,
parameters: newUser,
encoding: JSONEncoding.default)
.validate()
.responseDecodable(of: User.self) { response in
switch response.result {
case .success(let createdUser):
print("User created: \(createdUser)")
case .failure(let error):
print("Error creating user: \(error)")
}
}
API が URL がエンコードされたフォームのデータ(OAuth トークン交換の場合)を期待している場合は、代わりに を使用します。 ファイルのアップロードや混合データの場合、Alamofire は複数のパートリクエストを構成する を提供します。 例:
AF.upload(multipartFormData: { multipartFormData in
multipartFormData.append(Data("Jane Doe".utf8), withName: "name")
multipartFormData.append(imageData, withName: "avatar", fileName: "avatar.jpg", mimeType: "image/jpeg")
}, to: "https://api.example.com/users")
.validate()
.responseDecodable(of: User.self) { response in
// handle response
}
その他のHTTPメソッドと連携
RESTful API は、PUT (フルアップデート)、PATCH (部分的な更新)、DELETE (removal) 操作を要求することが多い。Alamofire は同じ [ メソッドでこれらを処理します。 パラメータを変更します。
プットとパッチ
既存のリソースを更新するには、[または[]を使用します。 リクエストボディは、更新されたフィールドを含みます。
let updatedFields: [String: Any] = ["name": "Jane Smith"]
AF.request("https://api.example.com/users/123",
method: .patch,
parameters: updatedFields,
encoding: JSONEncoding.default)
.validate()
.responseDecodable(of: User.self) { response in
// handle updated user
}
ディール
リソースを削除するには、通常、リクエストを要求する必要はありません。 応答は空であるか、確認メッセージを返す可能性があります。
AF.request("https://api.example.com/users/123",
method: .delete)
.validate()
.response { response in
if let error = response.error {
print("Delete failed: \(error)")
} else {
print("User deleted successfully")
}
}
常に、想定されるステータスコード(204 コンテンツなし)の API ドキュメントを確認してください。
高度なエラー処理とネットワーク監視
エラー処理がシームレスなユーザーエクスペリエンスにとっては、極めて重要です。Alamofire は、ネットワークエラー(タイムアウト、接続なし)、サーバーエラー(bad ステータスコード)、シリアル化障害(無効な JSON)と異なる [[]]]] タイプのエラーを報告します。特定のフィードバックを提供するエラーを調べることができます。
switch response.result {
case .success(let value):
// handle success
case .failure(let error):
if let afError = error.asAFError {
switch afError {
case .sessionTaskFailed(let sessionError):
print("Network issue: \(sessionError.localizedDescription)")
case .responseValidationFailed(let reason):
print("Validation failed: \(reason)")
default:
print("Other Alamofire error: \(afError.localizedDescription)")
}
}
}
ネットワークの到達性
リクエストをする前に、ネットワークの可用性をチェックしたいかもしれません。 Alamofireの[[[]]は接続の変更を監視します。 アプリケーションのライフサイクルで早期に監視を開始します。
let reachabilityManager = NetworkReachabilityManager()
reachabilityManager?.startListening { status in
switch status {
case .notReachable:
print("Network is not reachable")
case .reachable(.cellular):
print("Connected via cellular")
case .reachable(.ethernetOrWiFi):
print("Connected via WiFi")
case .unknown:
print("Unknown status")
}
}
これにより、ユーザやポストペアのリクエストを通知できます。より高度なパターンでは、接続が復元されるときに失敗したリクエストを再試行するなど、リトリート機構とリーチビリティを組み合わせることを検討してください。
生産準備が整ったネットワーキングのためのベストプラクティス
確立されたパターンは、ネットワークのレイヤーを保守可能、安全、実行可能に保ちます。
1. 共同可能なモデルを採用します
応答解析のために、常に[(または)に準拠するSwiftタイプを定義します。 これは、手動JSON操作を排除し、バグを削減します。 [または、ダイナミックなコンテンツが必要な場合は、を使用してください。 Appleの[]]]]]]]のCodable guideは、カスタムキーで高度なマッピングをカバーしています。
2. より安全な認証とトークン管理
API キーやトークンをハードコードしません。Keychain に機密値を格納し、 ヘッダーを使用してリクエストにそれらを添付します。OAuth フローでは、トークンリフレッシュインターセプターを実行します。Alamofire の プロトコルを使用すると、新しいトークンを取得した後に自動的にリクエストを再試すことができます。サンプル skeleton:
class AuthInterceptor: RequestInterceptor {
func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result<URLRequest, Error>) -> Void) {
var request = urlRequest
request.setValue("Bearer \(token)", forHTTPHeaderField: "Authorization")
completion(.success(request))
}
func retry(_ request: Request, for session: Session, dueTo error: Error, completion: @escaping (RetryResult) -> Void) {
// Check if error is 401, refresh token, then retry
completion(.retryWithDelay(1.0))
}
}
3. 同期/待ち合わせ
Alamofire 5 は、Swift のコンロモデルを完全にサポートしています。 クリーナー、リニアコードを書くためのリクエストメソッドの [バージョンを使用します。
do {
let users = try await AF.request("https://api.example.com/users")
.serializingDecodable([User].self)
.value
print("Users: \(users)")
} catch {
print("Error: \(error)")
}
構造化されたコンポテンシャル(タスクグループ、俳優)と組み合わせて、複数のリクエストを管理し、コールバックの地獄を回避します。
4. キャッシュの実装
ネットワークコールを削減し、オフラインサポートを改善するために、キャッシュポリシーを設定します。 Alamofire は (例えば、) を尊重します。また、適切なディスク容量でカスタム ] を使うこともできます。
let cache = URLCache(memoryCapacity: 10 * 1024 * 1024,
diskCapacity: 50 * 1024 * 1024,
diskPath: "networking_cache")
let session = Session(configuration: URLSessionConfiguration.default)
session.sessionConfiguration.urlCache = cache
5. ネットワーキング層をテストして下さい
mock のデータを使用して API クライアントのユニットテストを記述します。 Alamofire の [ は、あらかじめ定義されたレスポンスを返す mock プロトコルで注入できます。 や組み込み ] などのライブラリの使用を検討してください。 実際のエンドポイントを打つことなく、エラー処理と解析ロジックが正しいことを確認します。
6. 集中型ネットワーキング マネージャーを使用して下さい
ベースURL、ヘッダ、インターセプター、共有キャッシュで 1 つの [ インスタンスを構成する単一の [クラスを作成します。これにより、重複を防ぎ、ポリシーを交換したり、レイヤー全体をモックしたりすることができます。例:
class APIClient {
static let shared = APIClient()
private let session: Session
private init() {
let config = URLSessionConfiguration.default
config.timeoutIntervalForRequest = 30
config.urlCache = URLCache.shared
session = Session(configuration: config, interceptor: AuthInterceptor())
}
func fetchUsers() async throws -> [User] {
return try await session.request("\(baseURL)/users")
.serializingDecodable([User].self)
.value
}
}
ネットワークパターンの包括的な理解については、[] を参照して、Alamofire 高度な使用説明書 を参照してください。さらに、] REST API チュートリアルでは、堅牢な API の設計に貴重な洞察を提供します。
これらのガイドラインに従い、Alamofireの式APIを活用することで、強力でメンテナンスが容易であるネットワークレイヤーを構築できます。このライブラリは、必要なときに完全な制御を行なう一方で、URLの読み込みの退屈な側面を多く抽象化します。