アラモファイヤーの始まり

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の読み込みの退屈な側面を多く抽象化します。