#swift #deserialization #alamofire
#swift #десериализация #alamofire
Вопрос:
Для автоматической сериализации объекта ответа я использую пример (с некоторыми изменениями), представленный на странице Alamofire в GitHub. Это отлично работает для недействительных вызовов. Но в моем внутреннем API есть вызовы, которые возвращают только код HttpStatus без тела ответа, если это был успешный вызов, или с JSON в теле, если на стороне сервера было исключение. Я думал о другом расширении для DataRequest, которое вернет успех (без данных), если HttpStatusCode == 200 и вернет сбой с пользовательским объектом error, сериализованным из JSON для других кодов состояния. Но я понятия не имею, как вернуть успех без данных. Я буду действительно признателен за любую помощь.
extension DataRequest {
func responseObject<T: ResponseObjectSerializable>(queue: DispatchQueue? = nil, completionHandler: @escaping (DataResponse<T>) -> Void) -> Self
{
let responseSerializer = DataResponseSerializer<T> { request, response, data, error in
guard error == nil else { return .failure(BackendError.network(error: error!)) }
let jsonResponseSerializer = DataRequest.jsonResponseSerializer(options: .allowFragments)
let result = jsonResponseSerializer.serializeResponse(request, response, data, nil)
guard case let .success(jsonObject) = result else {
return .failure(BackendError.jsonSerialization(error: result.error!))
}
if response!.statusCode != 200 {
if let jsonWithException = jsonObject as? [String:Any]{
return .failure(BackendError.serverException(message: "serverException, statusCode=(response!.statusCode)", respomseBody: jsonWithException))
}else{
return .failure(BackendError.serverException(message: "unparseble serverException, statusCode != 200", respomseBody: nil))
}
}
guard let _ = response, let responseObject = T(representation: jsonObject) else {
return .failure(BackendError.objectSerialization(reason: "JSON could not be serialized: (jsonObject)"))
}
return .success(responseObject)
}
return response(queue: queue, responseSerializer: responseSerializer, completionHandler: completionHandler)
}
}
Комментарии:
1. вы нашли какое-либо решение, у меня такая же ошибка, если тело ответа недействительно! Пожалуйста, поделитесь, есть ли обходной путь!