HTTP Token 登录并执行token

HTTP Token Login & perform the token

这是我的 HTTP 代码。但是我的代码有一些问题。我不确定是解码部分还是获取数据部分。我想做的是获取令牌值。

func login(account: String, password: String, completion:@escaping (Result<String, AuthenticationError>) -> Void){
            
            
            guard let url = URL(string:"http://127.0.0.1:8080/login") else{
                fatalError("URL is not defined")
            }
            
            let loginString = String(format: "%@:%@", account, password)
            let loginData = loginString.data(using: String.Encoding.utf8)!
            let base64LoginString = loginData.base64EncodedString()
            
            
            let user = UserLogin(account: account, password: password)
            
            var request=URLRequest(url: url)
            request.httpMethod = "POST"
            request.setValue("Basic \(base64LoginString)", forHTTPHeaderField: "Authorization")
            request.httpBody = try? JSONEncoder().encode(user)
            URLSession.shared.dataTask(with: request){
                (data, response, error) in
                guard let httpURLResponse = response as? HTTPURLResponse else { return; }
                
                guard let data = data, error == nil else {
                    completion(.failure(.custom(errorMessage: "No data")))
                    return
                }
                
                guard let loginResponse = try? JSONDecoder().decode(UserToken.self, from: data)else{
                    completion(.failure(.invalidCredentials(errorMessage: "can't decode")))
                    return
                }
                
                
                let statusCode = httpURLResponse.statusCode
                if statusCode == 200{
                    let token = loginResponse.value
                    completion(.success(token))
                }else{
                    completion(.failure(.invalidCredentials(errorMessage: "invalid")))
                }
                
    
            }.resume()
        }

这是我的用户令牌模型

import Foundation



struct UserToken: Codable{
    var id: UUID?
    var value: String
    var expireTime: Date?
    var user: UserLogin?
}

这是我的用户登录模型:

import Foundation

struct UserLogin:Codable{
    var id: UUID?
    var account: String
    var password: String
}

这是获取用户令牌的格式json:

当我使用模拟器时,错误提示“操作无法完成。(Dating_Login.AuthenticationError 错误 1。)”

我正在使用私有函数来打印它。

private func UserLogin(){
                
                let defaults = UserDefaults.standard
                HTTPUser().login(account: number, password: pass){result in
                    switch result{
                    case .success(let token):
                        defaults.setValue(token, forKey: "value")
                        DispatchQueue.main.async {
                            self.isin = true
                            print(token)
                        }
                    case .failure(let error):
                        print(error.localizedDescription)
                    }
                }
            }

看起来好像解码失败了,expireTime - 虽然它的格式是日期,但它的类型是字符串。将您的模型更改为以下应该有效。

关于您的 UserLogin 模型的另一个注释,id 再次可以是与 UserToken 模型相同的可选字符串。 UserLogin 模型上的所有属性都需要是可选的,因为响应中只有 id

struct UserToken: Codable {
    var id: String?
    var value: String
    var expireTime: String?
    var user: User?
}

struct UserLogin: Codable {
    var id: String?
    var account: String?
    var password: String?
}