【发布时间】:2020-05-07 09:21:38
【问题描述】:
如果出现问题,有许多 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"
}
那么我该如何处理这种情况呢?我敢打赌,有更好的解决方案。在此先感谢:)
【问题讨论】:
-
var tickets: [Ticket]?是一个解决方案 -
将
tickets设为可选项有什么问题?这就是这种情况的处理方式,直到成功和失败的情况完全不同。 -
@PGDev 对我来说似乎有点奇怪,因为它要么有
tickets字段,要么有错误字段。没有其他方案,因此将tickets设为可选类型只是为了防止解码错误,对于这种简单的情况来说似乎过于复杂了。