为什么我不能将我的请求适配器拦截器与 Alamofire 请求一起使用?



我有这样的拦截器:

struct EnvInterceptor:RequestInterceptor,RequestRetrier {
let preferences = UserDefaults.standard

func adapt(_ urlRequest: URLRequest, for session: URLSession, completion: @escaping (Result<URLRequest, Error>) -> Void) {
var adaptedRequest = urlRequest

adaptedRequest.addValue("application/json", forHTTPHeaderField: "Content-Type")
guard urlRequest.url?.absoluteString.hasPrefix("/login") == true || urlRequest.url?.absoluteString.hasPrefix("/refresh") == true  else {
return completion(.success(urlRequest))
}

if self.preferences.integer(forKey: "expires_in") - Int(Date().timeIntervalSince1970) - self.preferences.integer(forKey: "time_delta")<=60  {

refreshTokens()
}

adaptedRequest.addValue("Bearer " + self.preferences.string(forKey: "access_token")!, forHTTPHeaderField: "Autorization")

print("request")

completion(.success(adaptedRequest))
}

func retry(_ request: Request, for session: Session, dueTo error: Error, completion: @escaping (RetryResult) -> Void) {

}


func refreshTokens(){
print("refresh tokens")
let parameters = ["token": self.preferences.string(forKey: "refresh_token") ?? ""]


var request = URLRequest(url: URL(string: Pathes.init().refreshTokens)!)
request.httpMethod = HTTPMethod.post.rawValue
request.httpBody =  try? JSONSerialization.data(withJSONObject: parameters, options: []);


AF.request(request).responseJSON() { response in
switch response.result {
case .success:
guard let data = response.data else {return}

do{
let resp = try JSONDecoder().decode(RefreshToken.self, from: data)

let dfmatter = DateFormatter()
dfmatter.dateFormat="EEE, dd MMM yyyy HH:mm:ss Z"
let date = dfmatter.date(from: response.response?.allHeaderFields["Date"] as! String)
let dateStamp:TimeInterval = date!.timeIntervalSince1970


DispatchQueue.main.async {
self.preferences.set(Int(dateStamp)-Int(Date().timeIntervalSince1970), forKey: "time_delta")
self.preferences.setValue(resp.expires_in, forKey: "expires_in")
self.preferences.setValue(resp.access_token, forKey: "access_token")
self.preferences.setValue(resp.refresh_token, forKey: "refresh_token")

}


}catch{
print(error.localizedDescription)
}

case .failure(let error):
print(error.responseCode as Any)
}
}

}

}

在这里我正在尝试使用它:

var request = URLRequest(Pathes.init().userInfo! as URL)
request.httpMethod = "GET"

let session = Alamofire.Session(
configuration: URLSessionConfiguration.default,
interceptor: Interceptor(adapters: [EnvInterceptor()]))

session.request(request).responseDecodable(of:PersonalInfo.self){(response) in
print(response.response?.statusCode)
}

问题是我看不到回应。我认为我在拦截器构建过程中做错了,也许有人会看到问题出在哪里?

你的意思是在这个guard子句中使用hasSuffix吗?因为没有 url 字符串可以有像"/login"这样的前缀。

guard urlRequest.url?.absoluteString.hasPrefix("/login") == true || urlRequest.url?.absoluteString.hasPrefix("/refresh") == true  else {
return completion(.success(urlRequest))
}

最新更新