Інженерний дизайн та аналіз
Реалізація реставрації комунікацій API в Ios з Alamofire
Table of Contents
Почати з Alamofire
Для початку інтеграції Alamofire в проект iOS ви можете додати бібліотеку за допомогою Swift Package Manager, CocoaPods або Carthage. Swift Package Manager є рекомендованим підхід, оскільки він вбудований в Xcode. Додати Alamofire пакет, навігуючи ]File] → Add Packages і введіть функціональність URL ]. Вкажіть версію 5.0.0 або пізніше. Крім того, якщо ви використовуєте CocoaPods, додайте [[FLT: 1]
import Alamofire
Alamofire alias забезпечує зручне в'язання для всіх спільних операцій HTTP. Під капюшоном він використовує Apple , але анотації від котелборду, як управління черги, кодування параметрів та перевірки відповіді. Це дозволяє зосередити увагу на логіці бізнесу, а не мереживному сантехнічному сливу. Для подальших деталей на основного мережевого шару, див. ]Apple'session документація.
Виконання запитів GET
Захоплюючи дані з RESTful endpoint є найбільш поширеною операцією. 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 APIs вимагають параметрів запиту або користувацького HTTP-голова. Alamofire приймає параметри як словник і ручки кодування автоматично для запитів 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-адреси запиту. Для індивідуального кодування можна вказати явну екземпляр, такі як .
Перевірка відповіді
метод автоматично перевіряє коди HTTP-стату в діапазоні 200–299 і відхиляє відповіді з ненадійним типом вмісту. Ви також можете додати критерії налаштування. Наприклад, для прийняття тільки кодів статусу 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
Часто необхідні API PUT (повний оновлення), PATCH (часткове оновлення), і DELETE (видалення) операції. 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")
}
}
Завжди перевірте документацію API для очікуваних кодів стану (наприклад, 204 Немає вмісту).
Розширений контроль помилок та мереж
Важко працювати з помилками, що є критичним для безшовного досвіду користувача. Аламофа повідомляє помилки через тип, який відрізняє між помилками мережі (час, без підключення), помилки сервера (код стану заборони), а також порушення послідовності (invalid 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)")
}
}
}
Мережева реабілітаційна безпека
Перед тим як зробити запити, ви можете перевірити наявність мережі. моніторить зміни підключення. Початок моніторингу на ранній стадії вашого життєвого циклу додатків:
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. Прийняти Codable Моделі
Завжди визначає типи Swift, які відповідають (або ) для відповіді парсингу. Це виключає керівництво JSON маніпуляції та зменшує помилки. Використовуйте або нижній рівень , якщо вам потрібен динамічний зміст. Apple Cкодований посібник охоплює розширене відображення з користувальницьких ключів.
2. Безпечне аутентифікування та управління токени
Ніколи не жорсткікод API ключі або токени. Зберігати чутливі значення в Keychain і прикріпити їх до запитів через заголовок. Для OAuth потоку, впровадити токени освіжуючий інтерцектор. Протокол Alamofire дозволяє автоматично переробляти запити після отримання нового токена. Приклад скелета:
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. Конвалюта з асинхроном / await
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. Впровадження каштану
Щоб зменшити мережеві дзвінки та покращити офлайн-підтримку, налаштуйте політику кешування. Аламіф поважає (наприклад, ]). Ви також можете використовувати користувацький з відповідною дисковою потужністю:
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. Тестувати свій мережевий шар
Написати тести на пристрій для клієнтів API, використовуючи дані mock. можна вводити з протоколом mock, який повертає заздалегідь визначені відповіді. Розглянемо такі бібліотеки, як або вбудований анотація. Тестування забезпечує обробку помилок і паролінг логіка правильні без удару реальних кінцевих точок.
6. Використовуйте централізований менеджер мереж
Створіть один клас, який налаштовує один екземпляр з базовою URL, заголовки, міжцептори, і загальний кеш. Це запобігає дублювання і полегшує політики затискання або змусить весь шар. Приклад:
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 Advanced Usage документація]. Додатково ]REST API підручник у реверсативному форматі.net пропонує цінні уявлення про створення надійних API.
За допомогою цих інструкцій та важільного експресивного API Alamofire ви можете створити мережевий шар, який є одночасно потужним і простим у підтримці. Бібліотека відокремлює безліч цікавих аспектів завантаження URL, а також надає вам повну контроль, коли вам потрібно.