swift之URLSession的使用






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

//

//        }

}

你可能感兴趣的:(iOS,/swift)