在iOS Swift中使用alamofire登录后如何传递JWT令牌?

我基于此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令牌传递到标头字段?

nongdada123456 回答:在iOS Swift中使用alamofire登录后如何传递JWT令牌?

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 }
}

因此,要获取该代码,您应该像这样:

ret

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

                        print(response.response.allHeaderFields)

    }
本文链接:https://www.f2er.com/3104947.html

大家都在问