Alamofire错误域= NSURLErrorDomain代码= -999"已取消"

时间:2016-11-06 08:40:11

标签: json swift xcode alamofire keychain

我已经成功获得了令牌的钥匙串并将其传递给下面显示的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(此处生成的令牌)"工作正常

5 个答案:

答案 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
}()