gpt4 book ai didi

swift - 如何在 iOS Swift 中使用 alamofire 登录后传递 JWT token ?

转载 作者:行者123 更新时间:2023-11-30 10:32:30 25 4
gpt4 key购买 nike

我是根据这个Networking sample实现登录的,它工作正常,我也得到了响应值。这些事情都是在框架内部完成的。

在框架中,我已经实现了登录 api 调用,在示例应用程序中,我将调用 apicall.login 方法。获得成功响应后,将返回响应框架。

从框架中,我如何从返回的响应中获取 authToken 值?

这是为框架编写的代码:APIRouter.swift

import Foundation
import Alamofire

enum APIRouter: URLRequestConvertible {

case login(username:String, password:String)
case getFilter


// MARK: - HTTPMethod
private var method: HTTPMethod {
switch self {
case .login:
return .post
case .getFilter:
return .get
}
}

// MARK: - Path
private var path: String {
switch self {
case .login:
return "/authentication"
case .getFilter:
return "/filter"
}
}

// MARK: - Parameters
private var parameters: Parameters? {
switch self {
case .login(let username, let password):
return [K.APIParameterKey.username: username, K.APIParameterKey.password: password]

case .getFilter:

return nil
}
}

// MARK: - URLRequestConvertible
func asURLRequest() throws -> URLRequest {
let url = try K.ProductionServer.baseURL.asURL()

var urlRequest = URLRequest(url: url.appendingPathComponent(path))
print(urlRequest)
// HTTP Method
urlRequest.httpMethod = method.rawValue

let token: String = UserDefaults.standard.string(forKey: "Token") ?? ""
let bearerToken: String = "Bearer " + token
print("baearer token::\(bearerToken)")

// Common Headers
urlRequest.setValue(ContentType.json.rawValue, forHTTPHeaderField: HTTPHeaderField.acceptType.rawValue)
urlRequest.setValue(ContentType.json.rawValue, forHTTPHeaderField: HTTPHeaderField.contentType.rawValue)
urlRequest.setValue(bearerToken, forHTTPHeaderField: HTTPHeaderField.authentication.rawValue)

// Parameters
if let parameters = parameters {
do {
urlRequest.httpBody = try JSONSerialization.data(withJSONObject: parameters, options: [])
} catch {
throw AFError.parameterEncodingFailed(reason: .jsonEncodingFailed(error: error))
}
}

return urlRequest
}
}

这是 APIClient.swift 的代码:

    import Foundation
import Alamofire

public class APIClient {
@discardableResult
private static func performRequest<T:Decodable>(route:APIRouter, decoder: JSONDecoder = JSONDecoder(), completion:@escaping (AFResult<T>)->Void) -> DataRequest {

return AF.request(route)
.responseDecodable (decoder: decoder){ (response: AFDataResponse<T>) in
completion(response.result)
print(response.result)

}


}


public static func login(username: String, password: String, completion:@escaping (AFResult<User>)->Void) {
performRequest(route: APIRouter.login(username: username, password: password), completion: completion)
}

public static func getFilter(completion:@escaping (AFResult<[Filter]>)->Void) {
let jsonDecoder = JSONDecoder()
performRequest(route: APIRouter.getFilter, decoder: jsonDecoder, completion: completion)
}


}//APIClient

这是框架返回响应值:

    framework response:: success(Flow.User(username: "demo", authToken: "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJhOGZsb3ciLCJleHAiOjE1NzM4ODQ1OTgsInVzZXJuYW1lIjoiZGVtbyJ9.funhPTuI6WjWOo0M2mKS_tDr0QBUkQ8SnDqdSKhrWog", expireDate: "Sat Nov 16 06:09:58 UTC 2019"))

示例应用程序内的 APIcall 方法:

      APIClient.login(username: "demo", password: "demo") { (result) in
switch result {
case .success(let login):
print("_____________________________")
print(login)



case .failure(let error):
print(error.localizedDescription)
}
}

如何使用 alamofire 将 JWT token 传递到 header 字段?

最佳答案

allHeaderFields 包含此信息

public typealias AFDataResponse<Success> = DataResponse<Success, AFError>

public struct DataResponse<Success, Failure: Error> {

/// The server's response to the URL request.
public let response: HTTPURLResponse?

}

open class HTTPURLResponse : URLResponse {
open var allHeaderFields: [AnyHashable : Any] { get }
}

因此,要获得,您应该像这样编写代码:

返回

urn AF.request(route)
.responseDecodable (decoder: decoder){ (response: AFDataResponse<T>) in

print(response.response.allHeaderFields)

}

关于swift - 如何在 iOS Swift 中使用 alamofire 登录后传递 JWT token ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58850434/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com