[有很多API会在发生问题时以适当的HTTP状态代码响应,但是也有一些API总是以200状态代码响应,这些状态代码描述了特定JSON字段中的错误。这正是我的情况。因此,我制定了一个BasicResponse
协议,该协议要求任何Codable
结构具有这些必填字段:
protocol BasicResponse: Codable {
var response: String { get }
var message: String? { get }
}
我的Codable
结构现在看起来像这样:
struct GetTicketsResponse: Codable, BasicResponse {
var response: String
var message: String?
var tickets: [Ticket]
}
而且我还创建了某种中间件解码器,以在早期阶段识别错误:
class AdvancedDecoder {
func decode<T: BasicResponse>(_ type: T.Type, from data: Data) throws -> T {
let result = try JSONDecoder().decode(T.self, from: data)
// Check if session is valid
if (result.message == "Session invalid") { throw AdvancedError.invalidSession }
return result
}
}
但是我注意到这种方法存在问题。如果服务器上发生故障,它将返回具有response
和message
字段但不具有tickets
字段的JSON,因此解码响应始终会失败。我可以将tickets
数组标记为可选类型var tickets: [Ticket]?
,但对我来说这似乎是一个非常奇怪的解决方法。这里有两个JSON供参考:
// If everything went smoothly
{
"response" : "OK",
"tickets" : [...]
}
// If something went wrong
{
"response" : "ERROR",
"message" : "Session invalid"
}
那么我该如何处理这种情况?我敢打赌,有一种更好的解决方案。在此先感谢:)
Response
结构。如果成功解码失败,请尝试使用失败响应进行解码。