我已经成功获得了令牌的钥匙串并将其传递给下面显示的AccessTokenAdapter类。 http127.0.0.1:8000 / api2 / projects /?format = json作为projectsURL传递。
class AccessTokenAdapter: RequestAdapter {
private let accessToken: String
init(accessToken: String) {
self.accessToken = accessToken
}
func adapt(_ urlRequest: URLRequest) throws -> URLRequest {
var urlRequest = urlRequest
// print("JWT \(accessToken)")
urlRequest.setValue("JWT \(accessToken)", forHTTPHeaderField: "Authorization")
return urlRequest
}
}
let sessionManager = SessionManager()
sessionManager.adapter = AccessTokenAdapter(accessToken: self.keychain["token"]!)
sessionManager.request(self.projectsURL, method: .get, encoding: JSONEncoding.default).responseJSON{ response in
switch response.result {
case .success:
print("yey I made it")
case .failure(let error):
print(error)
}
}
但是,从打印(错误),我的Xcode显示错误 错误域= NSURLErrorDomain代码= -999"已取消" UserInfo = {NSErrorFailingURLKey = http://127.0.0.1:8000/api2/projects/?format=json,NSLocalizedDescription =已取消,NSErrorFailingURLStringKey = http127.0.0.1:8000 / api2 / projects /?format = json}
任何想法?
Alamofire 4.0
钥匙扣
Xcode 8.1
Swift3
使用JWT进行身份验证
使用带有标题的邮递员,密钥="验证",值=" JWT(此处生成的令牌)"工作正常
答案 0 :(得分:7)
当你使sessionManager成为常量时,它不会比拥抱它的功能更长寿,因此一旦管理器被释放,会话就会结束。
要解决此问题,请将sessionManager保持更长时间。例如,在我的例子中,我把它作为一个类属性:
class NetworkRequest: {
var sessionManager = Alamofire.SessionManager()
...
func performRequest(_ call: APICall, customLink: String = "", parameters: Dictionary<String, Any> = ["":"" as Any]) {
let sessionConfig = URLSessionConfiguration.default
sessionConfig.timeoutIntervalForRequest = call.suggestedTimeout()
sessionConfig.timeoutIntervalForResource = call.suggestedTimeout()
sessionManager = Alamofire.SessionManager(configuration: sessionConfig)
sessionManager.adapter = AccessTokenAdapter()
sessionManager.request(urlString,
method: call.method(),
parameters: parameters,
encoding: call.chooseEncoding(),
headers: [:])
.responseJSON
{ response in
...
}
}
根据您的具体情况,解决方案可能会有所不同,但其目的是让sessionManager保持活动状态,直到网络请求结束。
答案 1 :(得分:2)
self.getSessionManager()
.request(urlstring,
method: methods,
parameters: parameters,
encoding: JSONEncoding.prettyPrinted,
headers: Header
).responseJSON(
queue: nil,
options: JSONSerialization.ReadingOptions.allowFragments
) { (responseObject) in
// response parsing code is here
}.session.finishTasksAndInvalidate()
在任务完成后输入invalidate方法,意味着session.finishTasksAndInvalidate()
一切都很棒。
答案 2 :(得分:1)
刚刚解决了。看起来需要事先设置httpmethod。
let url = URL(string: "http://127.0.0.1:8000/api2/projects/?format=json")
var urlRequest = URLRequest(url:url!)
urlRequest.httpMethod = HTTPMethod.get.rawValue
urlRequest.addValue("JWT \(self.keychain["token"]!)", forHTTPHeaderField: "Authorization")
urlRequest.addValue("application/json", forHTTPHeaderField: "Accept")
Alamofire.request(urlRequest)
.responseJSON { response in
debugPrint(response)
}
答案 3 :(得分:0)
如果其他人遇到了这个以及我做过的事情并且我没有发现https问题或者我发现的许多其他SO帖子中给出的其他答案,我得到了这个,并找到原因成为一个控制器,正在提出请求,但控制器没有显示。有点像,如果你有一些控制器只出现在特定的条件,它本身发出一个请求,在viewWillAppear或其他。我使用了一个基类来确定条件控制器中的调用是否应该尝试请求。这解决了我的问题。
答案 4 :(得分:0)
此错误通常是由您创建的SessionManager超出范围并被取消初始化引起的,您的请求将被取消。保持引用,我的解决方案是使用变量将SessionManager存储在您的APIService类中
public lazy var sharedManager: SessionManager = {
let configuration = URLSessionConfiguration.default
configuration.timeoutIntervalForRequest = 60
configuration.timeoutIntervalForResource = 60
let manager = Alamofire.SessionManager(configuration: configuration)
return manager
}()