puuurm / swift-weatherforecast

iOS app
1 stars 0 forks source link

Error Handling - HTTP Response #15

Closed puuurm closed 6 years ago

puuurm commented 6 years ago
  1. 아직까지는 발견된 http 응답 코드가 200과 404이다. 200일 경우 디코딩한 결과를 반환하고, 이외의 경우 FailureResponse가 적절한 error를 반환한다. 향후 모든 응답 코드에 대해서 대응할 계획.
    private func request<T>(
        _ params: [String: String],
        before object: Storable?,
        baseURL: BaseURL,
        type: T.Type,
        completion: @escaping ((ResponseResult<T>) -> Void)) {

        guard let url = WeatherAPI.url(baseURL: baseURL, parameters: params) else { return }
        NetworkSpinner.on()
        session.dataTask(with: url) { [weak self] (data, response, _) in
            guard let httpResponse = response as? HTTPURLResponse, let `self` = self else { return }
            let result = self.processRequest(type, response: httpResponse, data: data)
            completion(result)
            self.imageCache.deleteImageForkeys(keys: object?.cacheKeys)
            NetworkSpinner.off()
        }.resume()

    }

    private func processRequest<T: Decodable>(
        _ type: T.Type,
        response: HTTPURLResponse,
        data: Data?
        ) -> ResponseResult<T> {

        let status = response.statusCode
        if status == Http.Success,
            let jsonData = data {
            return WeatherAPI.objectFromJSONData(type, data: jsonData)
        } else {
            return .failure(FailureResponse(statusCode: status).error)
        }

    }
struct FailureResponse {
    let statusCode: Int

    var error: HttpError {
        switch statusCode {
        case 404: return HttpError.notFound
        case 300...307: return HttpError.redirection
        case 400...417: return HttpError.clientError
        default: return HttpError.serverError
        }
    }

    enum HttpError: Error, LocalizedError {
        case redirection    // 3xx
        case clientError    // 4xx
        case notFound       // 404
        case serverError    // 5xx

        var errorDescription: String? {
            switch self {
            case .notFound: return "HTTP Not Found"
            case .redirection: return "redirection"
            case .clientError: return "Client Error"
            case .serverError: return "Server Error"
            }
        }
    }
}