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

Ken*_*y H 5 xcode json keychain swift alamofire

我已经成功获得了令牌的钥匙串并将其传递给下面显示的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)
        }
    }
Run Code Online (Sandbox Code Playgroud)

但是,从打印(错误),我的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
Keychain
Xcode 8.1
Swift3
使用JWT进行身份验证
使用Postman with header,key ="Authentication",value ="JWT(此处生成的令牌)"工作正常

Vit*_*lii 11

当你使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
          ...
        }
Run Code Online (Sandbox Code Playgroud)

}

根据您的具体情况,解决方案可能会有所不同,但其目的是让sessionManager保持活动状态,直到网络请求结束.


Ken*_*y H 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)
    }
Run Code Online (Sandbox Code Playgroud)