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是一个表示任务对象的抽象类,一个会话创建一个任务,这里任务是指获取数据、下载或上传文件。
有三种类型的会话
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是一个表示任务对象的抽象类,一个会话创建一个任务,这里任务是指获取数据、下载或上传文件。
有三种类型的会话
==========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
//
// }
}