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调用时 您想解码,使用
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? = ....
应该使用。