Swift3.0 URLSession学习笔记

前端之家收集整理的这篇文章主要介绍了Swift3.0 URLSession学习笔记前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
因为iOS的权限限制, 如果使用HTTP协议要配置info.plist, 将Allow Arbitary Loads设为YES。

屏幕快照 2017-01-12 下午10.18.30.png

iOS封装了URLSession类处理HTTP交互, 支持交互文本、上传文件、下载文件

一、 文本交互
一般是用POST请求将包体数据传给后台后台返回json包体给手机端, 手机端解析json后做逻辑。

  1. let urlStr = "http://baike.baidu.com/api/openapi/BaikeLemmaCardApi?scope=103&format=json&appid=379020&bk_key=swift&bk_length=600"
  2. let url = URL(string: urlStr)
  3. var request = URLRequest(url: url!) //请求
  4. request.httpMethod = "POST" //修改http方法
  5. //request.httpBody = Data(bytes: <#T##Array<UInt8>#>) //设置POST包体
  6. let session = URLSession.shared
  7. let date = Date()
  8. print("创建任务, 时间:\(date.timeIntervalSince1970)")
  9. //初始化请求
  10. let dataTask = session.dataTask(with: request,completionHandler: { (data,resp,err) in
  11. let comDate = Date()
  12. print("http返回, 时间:\(comDate.timeIntervalSince1970)")
  13. if err != nil {
  14. print(err.debugDescription)
  15. } else {
  16. let responseStr = String(data: data!,encoding: String.Encoding.utf8)
  17. //print(responseStr!) //包体数据
  18. //print("mimeType: (resp?.mimeType) ")
  19. //URLResponse类里没有http返回值, 需要先强制转换!
  20. if let response = resp as? HTTPURLResponse {
  21. print("code\ (response.statusCode)")
  22. for (tab,result) in response.allHeaderFields {
  23. print("(tab.description) - (result)")
  24. }
  25. if response.statusCode == 200 {
  26. //JSON解析, 做逻辑
  27. } else {
  28. //通知UI接口执行失败
  29. }
  30. }
  31. }
  32. } ) as URLSessionTask
  33. let beginDate = Date()
  34. print("开始任务, 时间:\(beginDate.timeIntervalSince1970)")
  35. dataTask.resume() //执行任务
  36. let endDate = Date()
  37. print("结束任务, 时间:\(endDate.timeIntervalSince1970))

这段代码说明几个问题:
1、 request.httpMethod参数可以修改HTTP的方法, 默认是GET。

屏幕快照 2017-01-12 下午10.21.39.png

2、dataTask.resume()是异步执行的,即不阻塞UI。 这里还有闭包的一个概念叫逃逸闭包,对应关键字@escapting, 它的意思是将闭包做为回调异步执行(作用类似于Android的Runnable),调用时立刻返回。

  1. open func dataTask(with request: URLRequest,completionHandler: @escaping (Data?,URLResponse?,Error?) -> Swift.Void) -> URLSessionDataTask
执行日志:
  1. 创建任务, 时间:1484230880.29283
  2. 开始任务, 时间:1484230880.30001
  3. 结束任务, 时间:1484230880.30009
  4. http返回, 时间:1484230881.42724

3、 http交互成功后要判断返回值, 作为初学者我翻遍了URLResponse的方法, 就是没有status code。。。 后来无意中发现了HTTPResponse类, 试着强转并输出它的成员变量, 果然好用。

  1. code 200
  2. Server - Apache
  3. Content-Type - application/json
  4. Transfer-Encoding - Identity
  5. Date - Thu,12 Jan 2017 14:21:21 GMT
  6. Proxy-Connection - Keep-alive
  7. Tracecode - 12812437700874983946011222

4、http执行成功后就是要解析包体并做业务逻辑了, responseStr就是我们最终需要的json字符串, 我们需要反序列化并做逻辑。

  1. if response.statusCode == 200 {
  2. //JSON解析, 做逻辑
  3. } else {
  4. //通知UI接口执行失败
  5. }

二、 下载文件, 使用URLSession的API,代码很简单。 重点是存储位置, iOS会自动生成一个临时文件。 我们要做的是拷贝这个文件到我们想要的目录下。

  1. let url = URL(string: "http://img.pconline.com.cn/images/upload/upc/tx/wallpaper/1307/23/c0/23656308_1374564438338_800x600.jpg")
  2. let request = URLRequest(url: url!)
  3. let downloadTask = session.downloadTask(with: request)
  4. downloadTask.resume() //开始下载任务
  5. func urlSession( session: URLSession,downloadTask: URLSessionDownloadTask,didFinishDownloadingTo location: URL) {
  6. print("下载结束, 存储在(location.path)")
  7. }
  8. func urlSession( session: URLSession,didWriteData bytesWritten: Int64,totalBytesWritten: Int64,totalBytesExpectedToWrite: Int64) {
  9. print("total: (totalBytesWritten),current: (bytesWritten)") //下载进度
  10. }

日志:

  1. total: 46276,current: 46276
  2. 下载结束, 存储在/Users/brycegao/Library/Developer/CoreSimulator/Devices/8BE9C62E-042E-4B50-8F5D-78F857533650/data/Containers/Data/Application/3A6EB44A-2F88-4E79-9CFC-87713B9FC2E0/tmp/CFNetworkDownload_tnAj6u.tmp

三、上传文件, 因为没有测试服务器,无法调试。 代码上传文件类似。

  1. let uploadTask = session.uploadTask(with: request,from: data) {
  2. (data:Data?,response:URLResponse?,error:Error?) -> Void in
  3. //上传完毕
  4. if error != nil{
  5. print(error)
  6. }else{
  7. let str = String(data: data!,encoding: String.Encoding.utf8)
  8. print("上传完毕:(str)") //str是包体
  9. }
  10. }

小结: iOS对HTTP/HTTPS交互封装个一套完整方便的API,主要涉及URLSession、URLSesionTask、URLCache及其派生类; 支持文件上传/下载文件

猜你在找的Swift相关文章