Table of Contents
开始从阿拉莫火开始
要开始将 Alamomafire 整合到您的 iOS 项目中, 您可以使用 Swift 软件包管理器 CocoaPods 或 Cathage 添加库。 Swift 软件包管理器是您推荐的方法, 因为它被构建到 Xcode 中。 添加 Alamomafire 软件包, 方法是导航到 [ [FLT: 0]] 文件夹 – [ [[FLT: 2]] 添加软件包 [[FLT: 3] 并输入寄存器 URL [[FLT: 0] 。 或者, 如果您使用 CocoaPods , 请在您的 Pod 文件中添加 [ [[FLT: 1] 并运行 [[FLT: 2] 。 依赖性整合后, 在任何需要网络功能的 Swift 文件导入 Alamfire :
import Alamofire
Alamomire 的 化名为所有常见的 HTTP 操作提供了方便的切入点。 在引擎盖下, 它使用 Apple 的 , 但摘要删除锅炉板, 如队列管理、 参数编码和响应验证。 这样您就可以专注于商业逻辑而不是网络管道。 关于基础网络层的进一步细节, 请参考 Apple 的 URLSession 文档 [ 。
执行获取请求
从 RESTful 端点获取数据是最常用的操作。 Alamomire 使 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 头。 Alamomire 接受参数为字典, 并自动为 GET 请求处理编码( 参数附于 URL ) 。 标题通过 [ [FLT: 12] ] 参数添加 :
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
}
Alamomire 自动将参数编码并附加在请求的 URL 上。对于自定义编码,您可以指定一个明文 实例,例如 。
答复验证
方法自动检查200–299范围内的HTTP状态代码,并拒绝不可接受内容类型的响应。您也可以添加自定义验证标准。例如,仅接受200和201状态代码:
.validate(statusCode: [200, 201])
验证失败在响应处理器中作为错误报告,允许您在整个应用程序中执行一致的错误处理.
正在发送 POST 数据
创建或更新资源通常需要请求机构的 POST 请求。 Alamomire 支持多个编码策略,其中 是 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 令牌交换 ) , 请使用 [[FLT: 20] ] 。 对于文件上传或混合数据, Alamomafire 提供 [[FLT: 21] , 构建一个多段请求 。 例如 :
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
}
使用其他高技术、技术和方案方法
RESTFUL API 经常需要PUT(完整更新),PATCH(部分更新),和DELETE(移除)操作. Alamomire 处理这些操作时使用相同的方法;简单地更改参数.
点和点
要更新现有资源,请使用或。请求正文包含更新的字段:
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 No Content).
高级错误处理和网络监测
强力错误处理对于无缝用户体验至关重要。 Alamomire 通过 类型报告错误, 区分网络错误( 超时、 无连接)、 服务器错误( 不良状态代码) 和序列化失败( 无效 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)")
}
}
}
网络可达性
在提出请求之前, 您可能想要检查网络的可用性 。 Alamomire 的 [[FLT: 31]] 监视连接变化。 开始在您的应用程序生命周期中早期监测 :
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 操作并减少错误。 如果您需要动态内容, 请使用 [[FLT: 35] 或下级 [[FLT: 36] 。 Apple 的 [[FLT: 0] 编码指南[[[FLT: 1]] 覆盖了高级绘图和自定义密钥 。
2. 加强认证和托肯管理
绝不要硬码 API 密钥或令牌。 将敏感值存储在密钥链中, 并通过 [[FLT: 37] ] 头条附加到请求中。 对于 OAuth 流量, 请执行一个令牌刷新截取器。 Alamomire 的 [[FLT: 38] 协议允许您在获得新令牌后自动重试请求 。 样本骨架 :
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. 与合成/等待的货币
Alamomafire 5 完全支持 Swift 的货币模型。 使用 [[FLT: 40]] 版本的请求方法来写入更清洁的线性代码 :
do {
let users = try await AF.request("https://api.example.com/users")
.serializingDecodable([User].self)
.value
print("Users: \(users)")
} catch {
print("Error: \(error)")
}
将此与结构化的货币(任务组,演员)组合起来,管理多个请求,避免召回地狱.
4. 实施缓存
为了减少网络呼叫和改进离线支持, 配置缓存策略. Alamomire 尊重 (例如 ). 您也可以使用自定义 , 并具有适当的磁盘容量 :
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 客户端撰写单位测试。 Alamomire 的 [[FLT: 46]] 可以注入一个返回预定义的响应的模拟协议。 考虑使用像 [[FLT: 47] 这样的库或内建的 [[FLT: 48] 抽象。 测试可确保您的错误处理和解析逻辑正确而不击中真正的终点 。
6. 使用中央联网管理器
创建一个 [[FLT: 49] ] 类, 配置一个 [[FLT: 50] ] 实例, 并带有基准 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
}
}
为了全面了解网络模式,请参考 Alamomire高级使用文件。此外, REST API 教程在restifulapi.net为设计强力API提供了宝贵的见解。
通过遵循这些方针和借助阿拉莫火的表达式API,您可以构建一个既强大又易于维护的网络层。 库摘要删除了URL加载的许多乏味方面,同时在您需要时给予您充分控制。