Alamofire 5. *: декодировать и обрабатывать ошибки, проанализированные json ответ проверки с использованием jsonDecodable - PullRequest
0 голосов
/ 03 мая 2020

Я пытаюсь создать почтовый запрос к серверу, используя Alamofire:

static func callAndDecode<T:Decodable>(route:APIRouter, decoder: JSONDecoder = JSONDecoder()) -> Future<T> {
  return Future(operation: { completion in
      AF.request(route)
        .responseDecodable(decoder: decoder, completionHandler: { (response: DataResponse<T, AFError>) in
            switch response.result {
                case .success(let value):
                    completion(.success(value))
                case .failure(let error):
                    completion(error)
            }
        })
  })
}

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

Но проблема в том, что, например, когда я пытаюсь зарегистрировать пользователя, я отправляю параметры, но если электронная почта уже существует, я получаю сообщение об ошибке с кодом состояния 422 с сообщениями проверки для каждого параметра, который Я отправил, и это не удалось, в формате JSON.

response.data, после того, как произошла ошибка:

{
  "first_name" : [
      "The first name field is required."
  ],
  "email" : [
      "The email has already been taken."
  ]
}

Как я могу вернуть эти данные проверки с обработчиком завершения, так что если Я вызываю какой-то URL, и он выдает ошибку (422) с данными JSON, как вернуть эти данные с объектом ошибки?

Теперь у меня есть только error.localizedDescription, у меня нет доступа к данные, которые я получил с сервера. Так что, возможно, мне нужно как-то сериализовать ответ или создать свой собственный DataResponse, вот в чем вопрос?

Есть ли способ сделать это, или мне нужно go вернуться и использовать сеансы Swift URL?

Я пытался создать сериализатор с настраиваемым ответом, но мне не удалось, кто-нибудь может мне помочь?

Вот моя реализация этого сервиса:

class AuthService {
  static func login(email: String, password: String) -> Future<Auth> {
     return RequestAPI.callAndDecode(route: APIRouter.login(email: email, password: password))
  }

  static func signUp(parameters: [String: Any]) -> Future<ModuleRoot<User>> {
     return RequestAPI.callAndDecode(route: APIRouter.users(parameters: parameters))
  }
}

//MARK: Functions
func signUp() {
    AuthService.signUp(parameters: [
        "id": 1,
        "first_name":  self.firstName,
        "last_name":  self.lastName,
        "email":  self.email,
        "password": self.password
    ]).execute(onSuccess: { result in
        print("_____________________________")
        print(result)
        self.firstName = ""
        self.lastName = ""
        self.email = ""
        self.password = ""
        self.showLogin = true;
    }, onFailure: {error in
        if error.asAFError?.responseCode == 422 {
            debugPrint(error.localizedDescription )
            //todo: handle error validation
        }
    })
}

Я использую фреймворки Alamofire, PromisedFuture и Swifty JSON, ...

Это последняя попытка сделать это, потому что я пытаюсь найти решение целый день, не то чтобы я не пытался просто спросить здесь.

Заранее большое спасибо.

...