iT邦幫忙

2023 iThome 鐵人賽

DAY 19
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)
    }
}

requestData 函數是一個泛型函數,它接受四個參數:

  1. method: 代表 HTTP 請求的方法,可以是 GET、POST、PUT 等。
  2. path: 代表 API 的路徑,通常是一個定義了 API 端點的常數。
  3. parameters: 是一個泛型型別 E,代表請求的參數,這個參數將被編碼成 JSON 並添加到請求中。
  4. 函數返回一個泛型型別 D,代表 API 響應的數據,通常是一個 Swift 結構體或類型,它必須符合 Decodable 協議,以便能夠解析 API 響應。
    今天先大概介紹這邊,明天再繼續補充說明

上一篇
Day18 天氣API 5
下一篇
Day 20 泛型API 2
系列文
swift 新手路程30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言