我正在开始在 URLSession 中使用 Swift 并发来实现 Swift 中基于 API 的交互,并且在出现任何失败时将任何错误类型自定义为调用函数时遇到问题。
根据一些研究,我有一个简单的函数,可以使用 URL Session 发出 get 请求;
typealias NetworkResponse = (data: Data, response: URLResponse)
func getData<D: Decodable>(from endpoint: Route) async throws -> D {
let request = try createRequest(from: endpoint)
let response: NetworkResponse = try await session.data(for: request)
guard let urlResponse = response.response as? HTTPURLResponse else {
throw APIError.invalidServerResponse
}
let statusCode = urlResponse.statusCode
guard (200...299).contains(statusCode) else {
throw APIError.resourceUnavailable(statusCode)
}
return try decoder.decode(D.self, from: response.data)
}
如果请求成功,数据将按预期解码并返回,但问题是,如果抛出任何异常,则返回总是显示“操作无法完成。(GenericNetworkingLayer.APIError 错误。) “而不是错误响应。
我创建了一个错误枚举;
enum APIError: Error {
case invalidPath
case decodingError
case invalidServerResponse
case resourceUnavailable(Int) //Want to return statuscode here
}
为了测试,我只是在 VC ViewDidLoad() 中进行网络调用;
Task {
do {
let response: [PostsModel] = try await APIManager.shared.getData(from: .getCommentFromPost(postId: 1))
} catch {
print(error.localizedDescription)
}
}
我似乎缺少一些东西,让抛出数据返回我想要的东西。如果错误是resourceUnavailable,我最终希望至少获得抛出的statusCode,但我什至无法返回正确的错误。 我在研究中遇到过类似的代码,但没有任何东西不起作用,所以我希望有人能告诉我问题可能是什么?
这是我的本地化错误扩展;
extension APIError: LocalizedError {
var localizedDescription: String {
switch self {
case .invalidPath:
return "Invalid Path"
case .decodingError:
return "There was an error decoding the response"
case .invalidServerResponse:
return "Network request error."
case .resourceUnavailable:
return "Server or resource not available"
}
}
}
感谢@CraigSiemens 的帖子引用,我能够根据@Abuzeid 引用的帖子中的帖子修改我的错误扩展名来使其正常工作。
extension APIError: LocalizedError {
public var description: String {
switch self {
case .invalidPath:
return "Invalid Path"
case .decodingError:
return "There was an error decoding the response"
case .invalidServerResponse:
return "Network request error."
case .resourceUnavailable(let error):
return "Server or resource not available. Status Code: \(error)"
}
}
public var errorDescription: String? {
return description
}
}
然后我将我的打印声明更新为此;
print(error.localizedDescription.description)
现在我得到了我想要的输出,如下所示;
Server or resource not available. Status Code:404