重复使用相同函数以调用多个API端点的最简单方法是什么?

问题描述 投票:0回答:1
我有一个非常简单的iOS SwiftUi应用程序,该应用程序具有7个端点的API调用。 我写了一个函数来进行API调用并解码数据响应。 为了重复使用该函数,我需要替换端点URL字符串以及数据解码的类。 传递端点URL字符串很简单,但是我不知道如何将每个端点的不同数据类传递给API函数。 我已经搜索了一个示例,但没有发现我的用例。 我考虑过使用枚举,但我不确定如何实施。

BELOW是我的API调用函数的代码,并带有用于传递URL字符串的代码和数据类。

提前感谢您的帮助!

func apiLoader(urlString: String) { // Create API URL //let url = URL(string: "https://api-hockey.p.rapidapi.com/timezone") let url = URL(string: urlString) guard let requestUrl = url else { fatalError() } // Create URL Request var request = URLRequest(url: requestUrl) // Specify Headers to use let headers = [ "x-rapidapi-key": "REDACTED", "x-rapidapi-host": "REDACTED.p.rapidapi.com" ] // Specify HTTP Method to use request.httpMethod = "GET" request.allHTTPHeaderFields = headers // Send HTTP Request let task = URLSession.shared.dataTask(with: request) { (data, response, error) in // Check if Error took place if let error = error { print("Error took place \(error)") return } // Convert HTTP Response Data to a simple String if let data = data.self { do { let dateFormatter = DateFormatter() dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSSSS'Z'" let decoder = JSONDecoder() decoder.keyDecodingStrategy = .convertFromSnakeCase decoder.dateDecodingStrategy = .formatted(dateFormatter) let hockeyTimeZones = try decoder.decode(HockeyTimeZones.self, from: data) hockeyTimeZones.response!.forEach { timezone in print(timezone) } //return hockeyTimeZones } catch { print("Failed to load: \(error)") //return Void() } } } task.resume() //return HockeyTimeZones() # @Observable class HockeyTimeZones: ObservableObject, Codable { var get : String? = nil var parameters : [String]? = [] var errors : [String]? = [] var results : Int? = nil var response : [String]? = [] enum CodingKeys: String, CodingKey { case _get = "get" case _parameters = "parameters" case _errors = "errors" case _results = "results" case _response = "response" } required init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) get = try values.decodeIfPresent(String.self , forKey: ._get ) parameters = try values.decodeIfPresent([String].self , forKey: ._parameters ) errors = try values.decodeIfPresent([String].self , forKey: ._errors ) results = try values.decodeIfPresent(Int.self , forKey: ._results ) response = try values.decodeIfPresent([String].self , forKey: ._response ) } init() { } }

当您有多个返回不同类型的响应的API调用时
您想解码,使用
swift function swiftui parameters
1个回答
0
投票

例如:

func getData<T: Decodable>(from urlString: String) async -> T? { guard let url = URL(string: urlString) else { print(URLError(.badURL)) return nil // <-- todo, deal with errors } do { let (data, response) = try await URLSession.shared.data(from: url) guard let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200 else { print(URLError(.badServerResponse)) return nil // <-- todo, deal with errors } return try JSONDecoder().decode(T.self, from: data) // <--- here } catch { print(error) return nil // <-- todo, deal with errors } }

这样称呼:
 .task {
      let theResponse: ApiResponse? = await getData(from: "https://...")
 }

注意重要类型
ApiResponse?
这告诉类型

let theResponse: ApiResponse? = ....

应该使用。
    

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.