Я пытаюсь создать почтовый запрос к серверу, используя 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, ...
Это последняя попытка сделать это, потому что я пытаюсь найти решение целый день, не то чтобы я не пытался просто спросить здесь.
Заранее большое спасибо.