博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
swift之URLSession的使用
阅读量:4289 次
发布时间:2019-05-27

本文共 6145 字,大约阅读时间需要 20 分钟。

URLSession是一个可以响应发送或者接受HTTP请求的关键类,可以通过URLSessionConfiguration类新建URLSession实例。有以下三种方式:

  • URLSessionConfiguration.default

    默认configuration实例创建方式,使用硬盘上持久化全局缓存、证书(credential)和cookie的存储对象

  • URLSessionConfiguration.ephemeral

    唯一跟默认configuration不一样的是所以与会话(session)相关的数据都存储在内存中

  • URLSessionConfiguration.background(withIdentifier: "ConfigurationID")

    让会话在后台执行上载或下载任务。即使应用程序本身被暂停或终止,传输仍将继续

URLSessionConfiguration

URLSessionConfiguration可以配置会话(session)属性像timeout、HTTP header、缓存策略。

URLSessionTask

URLSessionTask是一个表示任务对象的抽象类,一个会话创建一个任务,这里任务是指获取数据、下载或上传文件。

有三种类型的会话

  • URLSessionDataTask: 处理从HTTP get请求中从服务器获取数据到内存中。
  • URLSessionUploadTask:上传硬盘中的文件到服务器,一般是HTTP POST 或 PUT方式
  • URLSessionDownloadTask: 从远程服务器下载文件到临时文件位置。

URLSession是一个可以响应发送或者接受HTTP请求的关键类,可以通过URLSessionConfiguration类新建URLSession实例。有以下三种方式:

  • URLSessionConfiguration.default

    默认configuration实例创建方式,使用硬盘上持久化全局缓存、证书(credential)和cookie的存储对象

  • URLSessionConfiguration.ephemeral

    唯一跟默认configuration不一样的是所以与会话(session)相关的数据都存储在内存中

  • URLSessionConfiguration.background(withIdentifier: "ConfigurationID")

    让会话在后台执行上载或下载任务。即使应用程序本身被暂停或终止,传输仍将继续

URLSessionConfiguration

URLSessionConfiguration可以配置会话(session)属性像timeout、HTTP header、缓存策略。

URLSessionTask

URLSessionTask是一个表示任务对象的抽象类,一个会话创建一个任务,这里任务是指获取数据、下载或上传文件。

有三种类型的会话

  • URLSessionDataTask: 处理从HTTP get请求中从服务器获取数据到内存中。
  • URLSessionUploadTask:上传硬盘中的文件到服务器,一般是HTTP POST 或 PUT方式
  • URLSessionDownloadTask: 从远程服务器下载文件到临时文件位置。

==========dataTask 的get请求===============

 func getSesssionDataTask()  {

第一个参数:请求对象        第二个参数:completionHandler回调(请求完成【成功|失败】的回调)                     data:响应体信息(期望的数据)                     response:响应头信息,主要是对服务器端的描述                     error:错误信息,如果请求失败,则error有值

        let urlStr = "\(BASEURL)"+LUNBOURL

        let sess = URLSession.shared;

        let urls:NSURL=NSURL.init(string: urlStr)!

        let request:URLRequest=NSURLRequest.init(url: urls as URL) as URLRequest

       let task = sess.dataTask(with: request) { (data, res, error) in

        if(error == nil){

            //.解析服务器返回的数据

            //说明:(此处返回的数据是JSON格式的,因此使用NSJSONSerialization进行反序列化处理)

          

            do {

                let dict  = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.allowFragments)

              print(dict)

            } catch {

                

            }

           

        }

        }

    task.resume()//开始执行

       

    }

========dataTask的POST请求===============

func postSesssionDataTask(){

        //1.创建会话对象

        

        let session: URLSession = URLSession.shared

        

        //2.根据会话对象创建task

         let urlstr="\(BASEURL)"+LUNBOURL

        let urls: NSURL = NSURL(string: urlstr)!

        

        //3.创建可变的请求对象

        

        let request: NSMutableURLRequest = NSMutableURLRequest(url: urls as URL)

        

        //4.修改请求方法为POST

        

        request.httpMethod = "POST"

        

        //5.设置请求体-------可以不设置,有默认的

        

        request.httpBody = "".data(using: String.Encoding.utf8)

        

//request.HTTPBody ="username=520it&pwd=520it&type=JSON".data(using: String.Encoding.utf8)

        //6.根据会话对象创建一个Task(发送请求)

        

        /*

         

         第一个参数:请求对象

         

         第二个参数:completionHandler回调(请求完成【成功|失败】的回调)

         

         data:响应体信息(期望的数据)

         

         response:响应头信息,主要是对服务器端的描述

         

         error:错误信息,如果请求失败,则error有值

         

         */

        

        let dataTask: URLSessionDataTask = session.dataTask(with: request as URLRequest) { (data, response, error) in

            

            if(error == nil){

            

          //(此处返回的数据是JSON格式的,因此使用NSJSONSerialization进行反序列化处理)

    

            do {

                let dict  = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.allowFragments)

                  print(dict)

            } catch {

                

                

            }

        

            }

        }

        //.执行任务

        dataTask.resume()

    }

    

 =================   downloadTask下载=========

断点续传参考:http://blog.csdn.net/u013023425/article/details/46608131

func postsesssionDownTask(){

        //1.创建会话对象

        let config:URLSessionConfiguration=URLSessionConfiguration.default

        let session:URLSession=URLSession.init(configuration: config, delegate: self, delegateQueue: OperationQueue.main)

        //2.根据会话对象创建task

         let urlstr="\(BASEURL)"+LUNBOURL

        let urls: NSURL = NSURL(string: urlstr)!

        

        //3.创建可变的请求对象

        

        var request:URLRequest  = URLRequest(url: urls as URL)

        

        //4.修改请求方法为POST

        

        request.httpMethod = "POST"

        

        //5.设置请求体-----可以不设置,有默认的

        

        request.httpBody = "".data(using: String.Encoding.utf8)

        

        //6.根据会话对象创建一个Task(发送请求)

        

        /*

         

         第一个参数:请求对象

         

         第二个参数:completionHandler回调(请求完成【成功|失败】的回调)

         

         data:响应体信息(期望的数据)

         

         response:响应头信息,主要是对服务器端的描述

         

         error:错误信息,如果请求失败,则error有值

         

         */

    

        

        let downTask=session.downloadTask(with: request) { (url, res, err) in

            

        }

        downTask.resume()

    }

****URLSessionDownloadDelegate:

    func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) {

         print("下载结束, 存储在(location.path)")

    //输出下载文件原来的存放目录

    print("location:\(location)")

    //location位置转换

    let locationPath = location!.path

    //拷贝到用户目录

    let documnets:String = NSHomeDirectory() + "/Documents/1.png"

    //创建文件管理器

    let fileManager = FileManager.default

    try! fileManager.moveItem(atPath: locationPath, toPath: documnets)

    print("new location:\(documnets)")

    }

    func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didResumeAtOffset fileOffset: Int64, expectedTotalBytes: Int64) {

        

    }

    func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) {

        print("total: (totalBytesExpectedToWrite), current: (totalBytesWritten)"//下载进度

    }

  

   

================uploadTask上传文件,可以通过url,和Data,上传

 func postsesssionUploadTask(){

        //1.创建会话对象

        let config:URLSessionConfiguration=URLSessionConfiguration.default

        let session:URLSession=URLSession.init(configuration: config, delegate: self, delegateQueue: OperationQueue.main)

        //2.根据会话对象创建task

         let urlstr="\(BASEURL)"+LUNBOURL

        let urls: NSURL = NSURL(string: urlstr)!

        

        //3.创建可变的请求对象

        

        var request:URLRequest  = URLRequest(url: urls as URL)

        

        //4.修改请求方法为POST

        

        request.httpMethod = "POST"

        

        //5.设置请求体-----可以不设置,有默认的

        

        request.httpBody = "".data(using: String.Encoding.utf8)

        

        //6.根据会话对象创建一个Task(发送请求)

        

        /*

         

         第一个参数:请求对象

         

         第二个参数:completionHandler回调(请求完成【成功|失败】的回调)

         

         data:响应体信息(期望的数据)

         

         response:响应头信息,主要是对服务器端的描述

         

         error:错误信息,如果请求失败,则error有值

         upDta:要上传的二进制数据

         */

let images:UIImage=UIImage.init(named: "bannerhomeOne")!

        let upData:Data=UIImagePNGRepresentation(images)!

//通过data数据上传

        let upTask=session.uploadTask(with: request, from: upData) { (data, res, error) in

            //上传完毕后

            if error != nil{

                print(error)

            }else{

                let str = String(data: data!, encoding: String.Encoding.utf8)

                print("上传完毕:\(str)")

            }

        }

      

       upTask.resume()

        

        

        

// 通过url上传数据     let upTask = session.uploadTask(with: request, fromFile: URL.init(string: "")!) { (data, res, error) in

//

//        }

}
你可能感兴趣的文章
Toolbar 不为人知的助手,ActionMenuView
查看>>
Java回调方法详解
查看>>
如何获取url中的参数并传递给iframe中的报表
查看>>
以前端架构师的思想看问题:解决单页应用,系统角色请求抢占session发送请求问题
查看>>
jsessionid问题解决方案
查看>>
MySQL和Oracle的delete,truncate
查看>>
idea使用心得(2)-安装设置与创建web项目
查看>>
将项目放到服务器tomcat上运行
查看>>
JS几种变量交换方式以及性能分析对比
查看>>
Android面试一天一题(6)——如何进行技术选型
查看>>
Velocity笔记--使用Velocity获取动态Web项目名的问题
查看>>
安卓学习:如何将一个Activity设置成窗口的样式
查看>>
Android: 自定义 View
查看>>
MySQL-99语法:外连接与内连接-(左内连接多表和查询)
查看>>
Struts2之Struts2-2.5.5 Interceptor
查看>>
Java基础-21总结字符流,IO流编码问题,实用案例
查看>>
Zookeeper请求处理
查看>>
当Java遇见了Html--Jsp……
查看>>
什么是分布式数据存储
查看>>
Java 进阶——类成员初始化顺序
查看>>