Swift 3 NSMutableURLRequest第二次调用失败

时间:2017-08-05 23:47:56

标签: ios iphone swift xcode nsmutableurlrequest

总而言之,我创建了一个向amazon aws服务器发送“GET”请求的函数,并在JSON中获取响应,然后将这些数据放在表中。当我第一次调用这些数据时,一切都运行正常,但当我回到主屏幕并再次使用表打开视图时,相同的函数失败,返回错误的标题错误,即使它第一次有效,我附上代码:

功能:

func getData(url:String, complete: @escaping ([Int:Any]) -> Void) {
    var array: [Int:Any] = [:]
    let headers = [
        "authorization": "Bearer codeBearer",
        "cache-control": "no-cache"
    ]
    print(headers)
    print(url)
    let request = NSMutableURLRequest(url: NSURL(string: url)! as URL, cachePolicy: .reloadIgnoringLocalAndRemoteCacheData, timeoutInterval: 10.0)
    request.httpMethod = "GET"
    request.allHTTPHeaderFields = headers
    let session = URLSession.shared
    let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
        if (error != nil) {
            print(error!) // errore
        } else {
            let input = String(data: data!, encoding: .utf8)?.data(using: .utf8) // json
            let json = try! JSON(data: input!)
            print(json)
            for (_,subJson):(String, JSON) in json {
                let num = subJson["index"].int
                if( num != nil ){
                    array[num!] = subJson
                }
            }
            session.invalidateAndCancel()
            complete(array)
        }
    })
    dataTask.resume()
}

查看:

@IBOutlet weak var table: UITableView!

func reload(){
    DispatchQueue.main.async{
        self.table.reloadData()
    }
}

override func viewDidLoad() {
    super.viewDidLoad()
    if( idCell == "cell" ){
        fun.getData(url: fun.request("/v1/media", test: true), complete: { success in
            self.array = success
            self.reload()
        })
    }else{
        fun.getData(url: fun.request("/v1/banner", test: true), complete: { success in
            self.array = success
            self.reload()
        })
    }
}

错误:

    {
  "message" : "'codeBearer' not a valid key=value pair (missing equal-sign) in Authorization header: 'Bearer codeBearer'."
}

如果我尝试通过curl发送请求,它每次都有效,而这里只在我第一次执行该功能时才有效,但是如果我关闭并重新打开应用程序它第一次再次工作,提示如何解决它?

2 个答案:

答案 0 :(得分:0)

要清理下面的会话调用。

session.invalidateAndCancel()

答案 1 :(得分:0)

我知道这个答案很晚,但是在使用 SOAP Web服务时我遇到了同样的问题。

在调用REST服务时,应在SOAP服务调用上使用ephemeral会话

示例代码

let session = URLSession(configuration: .ephemeral)

这是关于各种类型的URL会话的文档表格苹果

  1. default 会话的行为与共享会话非常相似,但允许 更多配置,并允许您逐步获取数据 代表。

  2. Ephemeral 会话类似于共享会话,但不写     缓存,cookie或凭据存储到磁盘。

  3. Background 会话可让您执行内容的上载和下载 在您的应用未运行时在后台运行。