Alamofire 发布可解码
Alamofire publish decodable
我有一个这样的 HTTP 请求到我的服务器。
func loginUser( username: String, password: String )->AnyPublisher<UserModel, Error>{
let url = URL( string: "\(Credentials.BASE_URL)auth/login")!
let userSignInModel = SignInModel(username: username, password: password)
return AF.request(url,
method: .post,
parameters: userSignInModel,
encoder: JSONParameterEncoder.default)
.validate()
.publishDecodable(type: UserModel.self)
.value()
.mapError{[=10=] as Error}
.receive(on: DispatchQueue.main)
.eraseToAnyPublisher()
}
并得到这样的回应
self.dataManager.loginUser(username: self.logInUsername, password: self.logInPassword)
.sink { (response) in
print( response )
switch response {
case .failure( let error ):
self.createAlert(with: error.localizedDescription,
for: .loginAlert,
responseCode: error.asAFError?.responseCode)
case .finished:
break
}
} receiveValue: { (userModel) in
self.token = userModel.token
self.userID = userModel.user.id
}.store(in: &cancellableSet)
但问题是我无法从服务器获取错误消息,怎么办?
有几种不同的方法来解析 return 成功或响应值的响应。也许最简单的方法是将任何初始故障映射到您自己的错误类型,该类型解析您需要的信息。例如,给定此错误类型:
struct NetworkError: Error {
let initialError: AFError
let backendError: BackendError?
}
其中 BackendError
封装了从后端 return 获取的信息。然后你可以映射来自 Alamofire 的响应。
AF.request(url,
method: .post,
parameters: userSignInModel)
.validate()
.publishDecodable(type: UserModel.self)
.map { response in
response.mapError { error in
// Check to see if it's an error that should have backend info.
// Assuming it is, parse the BackendError.
let backendError = response.data.flatMap { try? JSONDecoder().decode(BackendError.self, from: [=11=]) }
return NetworkError(initialError: error, backendError: backendError)
}
}
其他替代方案包括基于 enum
的响应类型,它将成功和失败分开,或者您自己的响应序列化程序在内部进行错误解析。
我有一个这样的 HTTP 请求到我的服务器。
func loginUser( username: String, password: String )->AnyPublisher<UserModel, Error>{
let url = URL( string: "\(Credentials.BASE_URL)auth/login")!
let userSignInModel = SignInModel(username: username, password: password)
return AF.request(url,
method: .post,
parameters: userSignInModel,
encoder: JSONParameterEncoder.default)
.validate()
.publishDecodable(type: UserModel.self)
.value()
.mapError{[=10=] as Error}
.receive(on: DispatchQueue.main)
.eraseToAnyPublisher()
}
并得到这样的回应
self.dataManager.loginUser(username: self.logInUsername, password: self.logInPassword)
.sink { (response) in
print( response )
switch response {
case .failure( let error ):
self.createAlert(with: error.localizedDescription,
for: .loginAlert,
responseCode: error.asAFError?.responseCode)
case .finished:
break
}
} receiveValue: { (userModel) in
self.token = userModel.token
self.userID = userModel.user.id
}.store(in: &cancellableSet)
但问题是我无法从服务器获取错误消息,怎么办?
有几种不同的方法来解析 return 成功或响应值的响应。也许最简单的方法是将任何初始故障映射到您自己的错误类型,该类型解析您需要的信息。例如,给定此错误类型:
struct NetworkError: Error {
let initialError: AFError
let backendError: BackendError?
}
其中 BackendError
封装了从后端 return 获取的信息。然后你可以映射来自 Alamofire 的响应。
AF.request(url,
method: .post,
parameters: userSignInModel)
.validate()
.publishDecodable(type: UserModel.self)
.map { response in
response.mapError { error in
// Check to see if it's an error that should have backend info.
// Assuming it is, parse the BackendError.
let backendError = response.data.flatMap { try? JSONDecoder().decode(BackendError.self, from: [=11=]) }
return NetworkError(initialError: error, backendError: backendError)
}
}
其他替代方案包括基于 enum
的响应类型,它将成功和失败分开,或者您自己的响应序列化程序在内部进行错误解析。