Swift 3中NSMutableURLRequest第二次调用失败。

3

首先,我创建了一个发送“GET”请求到Amazon AWS服务器的函数,并获取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

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

当您像调用REST服务一样调用SOAP服务时,应该使用ephemeral会话

示例代码:

let session = URLSession(configuration: .ephemeral)

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

  1. 默认会话的行为类似于共享会话,但允许更多配置,并允许您通过委托逐步获取数据。

  2. 临时会话类似于共享会话,但不会将缓存、cookie或凭据写入磁盘。

  3. 后台会话允许您在应用程序未运行时在后台执行内容的上传和下载。


0

要清理会话,请调用以下方法。

session.invalidateAndCancel()

那么,你不能把数据存储到一个变量中吗?这样第二次就不需要再次调用了吧?这有意义吗? - Hussain Shabbir
好的,你能把“Bearer codeBearer”改成“Bearer-codeBearer”吗?只是为了测试一下它是否有效? - Hussain Shabbir
你是在任务完成后调用 invalidateAndCancel() 吗?如果没有,请尝试调用它。 - Hussain Shabbir
当会话任务完成时,我们在项目中调用此函数。 - Hussain Shabbir
我输入了 "session.invalidateAndCancel()",但它仍然出现相同的错误。 - peppinoibra
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接