我基于此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返回响应值:
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令牌传递到标头字段?