Как определить конкретную ошибку c 409 из AFError? - PullRequest
0 голосов
/ 02 марта 2020

У меня есть метод, который возвращает Single<(HTTPURLResponse, Any)>, выполняющий вызов веб-службы.

Этот вызов возвращает 409 по нескольким причинам, и эта причина передается как JSON в ответе. Я знаю, что JSON находится в атрибуте данных объекта DataResponse, но я хотел бы иметь его в AFError, которую я передаю при возникновении ошибки. Я хочу отобразить конкретное сообщение об ошибке c 409, связанное с ответом JSON пользователю, чтобы он мог понять, что произошло.

Как я мог это сделать?

Я искал это в Stackoverflow, а также на github Alamofire, но не смог найти никакой помощи в моем случае.

return Single<(HTTPURLResponse, Any)>.create(subscribe: { single in
    let request = self.sessionManager.request(completeURL, method: httpMethod, parameters: params, encoding: encoding, headers: headers)
    request.validate().responseJSON(completionHandler: { (response) in
        let result = response.result
        switch result {

        case let .success(value): single(.success((response.response!, value)))
        case let .failure(error): single(.error(error))
        }
    })

    return Disposables.create { request.cancel() }
})

Я работаю с Alamofire 4.9.1

1 Ответ

0 голосов
/ 03 марта 2020
 request.validate().responseJSON { (response) in


        let statusCode = response.response?.statusCode ?? 0

        guard statusCode !=  409 else {

            if let data = response.data, let errorJson = try? JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: Any] {
                let errorMessage = errorJson["message"] as? String
                let customError = CustomError(message: errorMessage)
                single(.error(customError))
            }


            return
        }


        let result = response.result

        switch result {
        case let .success(value): single(.success((response.response!, value)))
        case let .failure(error): single(.error(error))
        }
    }

Я полагаю, что таким способом вы сможете достичь своих требований. создайте пользовательский класс Error, чтобы передать ошибку до завершения. не забудьте вызвать завершение, если ошибка Json не сериализована.

class CustomError: Error {

var localizedDescription: String { message ?? "" }

var message: String?

init(message: String?) {
    self.message = message
}

}

...