swift之网络请求工具类(Alamofire+HandyJSON封装)async
使用 Alamofire + HandyJSON 封装(支持 async/await 和 JSON 字符串返回)
下面是一个结合 Alamofire 和 HandyJSON 的完整封装方案,支持 async/await 并可以返回 JSON 字符串或模型对象。
1. 基础封装
import Alamofire
import HandyJSON
enum NetworkError: Error {
case invalidURL
case invalidResponse
case statusCode(Int, String?)
case decodingError(Error)
case underlying(Error)
case noData
case jsonSerializationFailed
}
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()
.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 {
// 尝试解析错误信息
let errorMessage = try? JSONSerialization.jsonObject(with: response.data ?? Data(), options: []) as? [String: Any]
continuation.resume(throwing: NetworkError.statusCode(code, errorMessage?["message"] as? String))
return
}
default: break
}
}
continuation.resume(throwing: NetworkError.underlying(error))
}
}
}
}
// MARK: - 公开方法
