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?
}
这是我的 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?
}