如何解决如何从 SwiftUI 中的 URLSession 获取响应
我正在尝试在 SwiftUI 中构建一个 URLSession 来处理基于 API 令牌的登录 Web 应用程序的身份验证。
我可以让 API 在 Postman 中正常工作,但无法在 SwiftUI 中获得任何可读的响应。我是 SwiftUI 和调试的新手。从处理授权的 Web 服务器的日志来看,来自我的 Swift 代码的登录请求似乎成功了,但我似乎无法解析正文或标题。
我的画布中不断出现“LoginResponse(message: nil)”。
这里是我的 SwiftUI 代码,只是尝试打印 URLSession 响应。
import Foundation
enum AuthenticationError: Error {
case invalidCredentials
case custom(errorMessage: String)
}
struct LoginRequestBody: Codable {
let email: String
let password: String
}
struct LoginResponse: Codable {
let message: String?
}
class Sessionservice {
func login(emailAddress: String,password: String,completion: @escaping (Result<String,AuthenticationError>) -> Void){
guard let url = URL(string: "https://www.example.com/api/v1/auth/sign_in") else {
completion(.failure(.custom(errorMessage:"Site is unavailable. Try again later.")))
return
}
let body = LoginRequestBody(email: "email@example.com",password: "password")
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.addValue("application/json",forHTTPHeaderField: "Content-Type")
request.httpBody = try? JSONEncoder().encode(body)
URLSession.shared.dataTask(with: request) { (data,response,error) in
guard let data = data,error == nil else {
completion(.failure(.custom(errorMessage: "No data")))
return
}
try! JSONDecoder().decode(LoginResponse.self,from: data)
guard let loginResponse = try? JSONDecoder().decode(LoginResponse.self,from: data) else {
completion(.failure(.custom(errorMessage: "loginResponse Failure")))
return
}
print(loginResponse)
}.resume()
}
}
解决方法
import Foundation
import SwiftUI
enum AuthenticationError: Error {
case invalidCredentials
case custom(errorMessage: String)
}
struct LoginRequestBody: Codable {
let email: String
let password: String
}
struct LoginResponse: Decodable {
let data: LoginValue?
let success: Bool?
let client: String?
}
struct LoginToken: Decodable {
let token: String?
}
struct LoginValue: Decodable {
let message: String?
let user: UserRole?
let success: Bool?
}
struct UserRole: Decodable {
let role: String?
}
class Sessionservice {
func login(email: String,password: String,completion: @escaping (Result<String,AuthenticationError>) -> Void){
guard let url = URL(string: "https://www.example.com/api/v1/auth/sign_in") else {
completion(.failure(.custom(errorMessage:"Site is unavailable. Try again later.")))
return
}
let body = LoginRequestBody(email: email,password: password)
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.addValue("application/json",forHTTPHeaderField: "Content-Type")
request.httpBody = try? JSONEncoder().encode(body)
URLSession.shared.dataTask(with: request) { (data,response,error) in
if let response = response as? HTTPURLResponse {
guard let token = response.value(forHTTPHeaderField: "Accesstoken") else {
completion(.failure(.custom(errorMessage: "Missing Access Token")))
return
}
completion(.success(token))
}
guard let data = data,error == nil else { return }
guard let loginResponse = try? JSONDecoder().decode(LoginResponse.self,from: data) else { return }
guard let messageData = loginResponse.data else {return}
guard let message = messageData.message else {return}
guard let userRole = messageData.user else {return}
guard let role = userRole.role else {return}
completion(.success(message))
completion(.success(role))
}.resume()
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。