iT邦幫忙

2023 iThome 鐵人賽

DAY 20
0
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)
    }
}

上篇文章中只是初步的介紹函數,接著我們繼續補充函數內的功能

函數功能

  1. 函數使用了 Swift 的 async 和 throws 關鍵字,表示它是一個異步函數,並且可以拋出錯誤。

  2. 通過調用 handelHttpMethod 函數,根據請求方法、API 路徑和參數創建一個 URLRequest 對象。

  3. 使用異步的 URLSession 函數來發送請求,並等待響應。

  4. 檢查 HTTP 響應的狀態碼,如果不在 200 到 299 的範圍內,則拋出相應的錯誤。

  5. 如果響應狀態碼正確,則使用 JSONDecoder 將響應數據解碼為泛型型別 D。

  6. 如果解碼成功,則打印請求和響應的內容(僅在 DEBUG 模式下),然後返回解碼後的數據。

  7. 如果任何步驟出錯,捕獲錯誤並拋出相應的錯誤。

錯誤處理
函數定義了多個可能的錯誤,例如無效的響應、授權錯誤、找不到資源、內部錯誤等,並根據響應狀態碼拋出相應的錯誤。

  1. 如果 JSON 解碼失敗,則拋出 JSON 解碼失敗的錯誤。

  2. 如果在請求過程中出現其他錯誤,則拋出未知錯誤。

  3. 這個函數的主要目的是簡化 API 請求的處理過程,並提供錯誤處理機制,以確保應用程序能夠處理各種可能的錯誤 情況。


上一篇
Day19 泛型API1
下一篇
Day21 泛型API 3
系列文
swift 新手路程30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言