Alamofire, обработайте вызов void, который может возвращать ответ с HTTPError и телом json в Swift 3

#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. вы нашли какое-либо решение, у меня такая же ошибка, если тело ответа недействительно! Пожалуйста, поделитесь, есть ли обходной путь!