【发布时间】:2022-01-02 19:50:04
【问题描述】:
我正在使用 SwiftUI 和 Combine 进行登录。您能否给我一些想法,当用户输入错误的电子邮件或密码时,如何解码并显示 json 错误?我只能拿到token。
当我使用错误的电子邮件或密码执行相同的登录请求时,服务器会返回此错误消息:
{
"code": "[jwt_auth] incorrect_password",
"message": "Incorrect password!",
"data": {
"status": 403
}
}
问题是我无法理解在组合中执行一个请求时如何解码两个不同的 json 响应?我只能拿到token。
这是登录请求的模型:
struct LoginResponse: Decodable {
let token: String }
struct ErrorResponse: Decodable {
let message: String
}
struct Login: Codable {
let username: String
let password: String
}
static func login(email: String, password: String) -> AnyPublisher<LoginResponse, Error> {
let url = MarketplaceAPI.jwtAuth!
var request = URLRequest(url: url)
let encoder = JSONEncoder()
let login = Login(username: email, password: password)
let jsonData = try? encoder.encode(login)
request.httpBody = jsonData
request.httpMethod = HTTPMethod.POST.rawValue
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
return URLSession.shared
.dataTaskPublisher(for: request)
.print()
.receive(on: DispatchQueue.main)
.map(\.data)
.decode(
type: LoginResponse.self,
decoder: JSONDecoder())
.eraseToAnyPublisher()
}
在 viewModel 中:
MarketplaceAPI.login(email: email, password: password)
.sink(
receiveCompletion: { completion in
switch completion {
case .finished:
print("finished")
case .failure(let error):
print("Failure error:", error.localizedDescription) // This's returning token error
}
},
receiveValue: { value in
print("Token:", value.token)
}
})
.store(in: &subscriptions)
}
【问题讨论】:
-
当您只显示一个 JSON 响应时,“两个不同的 json 响应”是什么意思?你的意思是登录成功的时候会回复
{"token": "xxx"}这样的东西吗? -
实现
init(from decoder并将 JSON 解码为带有success和failure案例的关联值的枚举。然后在枚举上的decode运算符switch之后,在failure情况下抛出错误。 -
是的,如果响应成功,服务器只返回token。如果用户在一个组合功能中输入错误的密码或电子邮件,我无法理解如何解码错误消息
-
@vadian 谢谢你的想法,我会试试的。