swift之网络请求工具类(Alamofire封装)async
使用 async/await 封装 Alamofire (JSON 格式返回)
下面是一个基于 Alamofire 的现代化封装,使用 Swift 的 async/await 语法,返回 JSON 格式数据。
1. 基础封装
import Alamofire
enum NetworkError: Error {
case invalidURL
case invalidResponse
case statusCode(Int)
case decodingError(Error)
case underlying(Error)
case noData
}
class NetworkManager {
static let shared = NetworkManager()
private let session: Session
private init() {
let configuration = URLSessionConfiguration.af.default
configuration.timeoutIntervalForRequest = 30
configuration.timeoutIntervalForResource = 60
session = Session(configuration: configuration)
}
// MARK: - 基础请求方法
private func request(
_ url: URLConvertible,
method: HTTPMethod = .get,
parameters: Parameters? = nil,
encoding: ParameterEncoding = JSONEncoding.default,
headers: HTTPHeaders? = nil
) async throws -> Data {
return try await withCheckedThrowingContinuation { continuation in
session.request(
url,
method: method,
parameters: parameters,
encoding: encoding,
headers: headers
)
.validate() // 自动验证状态码 200-299
.responseData { response in
switch response.result {
case .success(let data):
continuation.resume(returning: data)
case .failure(let error):
if let afError = error.asAFError {
switch afError {
case .responseValidationFailed(let reason):
if case .unacceptableStatusCode(let code) = reason {
continuation.resume(throwing: NetworkError.statusCode(code))
return
}
default: break
}
}
continuation.resume(throwing: NetworkError.underlying(error))
}
}
}
}
// MARK: - 公开方法
func requestJSON<T: Decodable>(
_ url: URLConvertible,
method: HTTPMethod = .get,
parameters: Parameters? = nil,
encoding: ParameterEncoding = JSONEncoding.default,
headers: HTTPHeaders? = nil,
decoder: JSONDecoder = JSONDecoder
