public func requestData<E,D> (method: HttpMethod, path: ApiPathConstantse, parameters: E?) async throws -> D where E: Encodable, D: Decodable {
let UrlRequest = handelHttpMethod(method: method, path: path, parameter: parameters)
do {
let (data, response) = try await URLSession.shared.data(for: UrlRequest)
guard let response = (response as? HTTPURLResponse) else {
throw RequestError.invalidResponse
}
let statusCodes = response.statusCode
print("\(statusCodes)")
guard (200...299).contains(statusCodes) else {
switch statusCodes {
case 400:
throw RequestError.invalidResponse
case 401:
throw RequestError.authorizationError
case 404:
throw RequestError.notFound
case 500:
throw RequestError.internalError
case 502:
throw RequestError.serverError
case 503:
throw RequestError.serverUnavailable
default:
throw RequestError .invalidResponse
}
}
do {
let result = try JSONDecoder().decode(D.self, from: data)
#if DEBUG
printNetworkProgress(urlRequest: UrlRequest, parameters: parameters, results: result)
#endif
return result
} catch {
throw RequestError.jsonDecodeFailed(error as! DecodingError)
}
}catch {
print(error.localizedDescription)
throw RequestError.unknownError(error)
}
}
上篇文章中只是初步的介紹函數,接著我們繼續補充函數內的功能
函數功能
函數使用了 Swift 的 async 和 throws 關鍵字,表示它是一個異步函數,並且可以拋出錯誤。
通過調用 handelHttpMethod 函數,根據請求方法、API 路徑和參數創建一個 URLRequest 對象。
使用異步的 URLSession 函數來發送請求,並等待響應。
檢查 HTTP 響應的狀態碼,如果不在 200 到 299 的範圍內,則拋出相應的錯誤。
如果響應狀態碼正確,則使用 JSONDecoder 將響應數據解碼為泛型型別 D。
如果解碼成功,則打印請求和響應的內容(僅在 DEBUG 模式下),然後返回解碼後的數據。
如果任何步驟出錯,捕獲錯誤並拋出相應的錯誤。
錯誤處理
函數定義了多個可能的錯誤,例如無效的響應、授權錯誤、找不到資源、內部錯誤等,並根據響應狀態碼拋出相應的錯誤。
如果 JSON 解碼失敗,則拋出 JSON 解碼失敗的錯誤。
如果在請求過程中出現其他錯誤,則拋出未知錯誤。
這個函數的主要目的是簡化 API 請求的處理過程,並提供錯誤處理機制,以確保應用程序能夠處理各種可能的錯誤 情況。