屏幕快照 2017-01-12 下午10.18.30.png
iOS封装了URLSession类处理http交互, 支持交互文本、上传文件、下载文件。
一、 文本交互
一般是用POST请求将包体数据传给后台, 后台返回Json包体给手机端, 手机端解析Json后做逻辑。
let urlStr = "http://baike.baidu.com/api/openapi/BaikeLemmaCardApi?scope=103&format=json&appid=379020&bk_key=swift&bk_length=600" let url = URL(string: urlStr) var request = URLRequest(url: url!) //请求 request.httpMethod = "POST" //修改http方法 //request.httpBody = Data(bytes: <#T##Array<UInt8>#>) //设置POST包体 let session = URLSession.shared let date = Date() print("创建任务, 时间:\(date.timeIntervalSince1970)") //初始化请求 let dataTask = session.dataTask(with: request,completionHandler: { (data,resp,err) in let comDate = Date() print("http返回, 时间:\(comDate.timeIntervalSince1970)") if err != nil { print(err.deBUGDescription) } else { let responseStr = String(data: data!,enCoding: String.EnCoding.utf8) //print(responseStr!) //包体数据 //print("mimeType: (resp?.mimeType) ") //URLResponse类里没有http返回值, 需要先强制转换! if let response = resp as? httpURLResponse { print("code\ (response.statusCode)") for (tab,result) in response.allheaderFIElds { print("(tab.description) - (result)") } if response.statusCode == 200 { //JsON解析, 做逻辑 } else { //通知UI接口执行失败 } } } } ) as URLSessionTask let beginDate = Date() print("开始任务, 时间:\(beginDate.timeIntervalSince1970)") dataTask.resume() //执行任务 let endDate = Date() print("结束任务, 时间:\(endDate.timeIntervalSince1970))
这段代码说明几个问题:
1、 request.httpMethod参数可以修改http的方法, 默认是GET。
2、dataTask.resume()是异步执行的,即不阻塞UI。 这里还有闭包的一个概念叫逃逸闭包,对应关键字@escapting, 它的意思是将闭包做为回调异步执行(作用类似于AndroID的Runnable),调用时立刻返回。
open func dataTask(with request: URLRequest,completionHandler: @escaPing (Data?,URLResponse?,Error?) -> Swift.VoID) -> URLSessionDataTask执行日志:
创建任务, 时间:1484230880.29283开始任务, 时间:1484230880.30001结束任务, 时间:1484230880.30009http返回, 时间:1484230881.42724
3、 http交互成功后要判断返回值, 作为初学者我翻遍了URLResponse的方法, 就是没有status code。。。 后来无意中发现了httpResponse类, 试着强转并输出它的成员变量, 果然好用。
code 200Server - ApacheContent-Type - application/Jsontransfer-encoding - IDentityDate - Thu,12 Jan 2017 14:21:21 GMTProxy-Connection - Keep-aliveTracecode - 12812437700874983946011222
4、http执行成功后就是要解析包体并做业务逻辑了, responseStr就是我们最终需要的Json字符串, 我们需要反序列化并做逻辑。
if response.statusCode == 200 { //JsON解析, 做逻辑 } else { //通知UI接口执行失败 }
二、 下载文件, 使用URLSession的API,代码很简单。 重点是存储位置, iOS会自动生成一个临时文件。 我们要做的是拷贝这个文件到我们想要的目录下。
let url = URL(string: "http://img.pconline.com.cn/images/upload/upc/tx/wallpaper/1307/23/c0/23656308_1374564438338_800x600.jpg")let request = URLRequest(url: url!)let downloadTask = session.downloadTask(with: request)downloadTask.resume() //开始下载任务func urlSession( session: URLSession,downloadTask: URLSessionDownloadTask,dIDFinishDownloadingTo location: URL) { print("下载结束, 存储在(location.path)")}func urlSession( session: URLSession,dIDWriteData bytesWritten: Int64,totalBytesWritten: Int64,totalBytesExpectedToWrite: Int64) { print("total: (totalBytesWritten),current: (bytesWritten)") //下载进度}
日志:
total: 46276,current: 46276下载结束, 存储在/Users/brycegao/library/Developer/CoreSimulator/Devices/8BE9C62E-042E-4B50-8F5D-78F857533650/data/Containers/Data/Application/3A6EB44A-2F88-4E79-9CFC-87713B9FC2E0/tmp/CFNetworkDownload_tnAj6u.tmp
三、上传文件, 因为没有测试服务器,无法调试。 代码跟上传文件类似。
let uploadTask = session.uploadTask(with: request,from: data) { (data:Data?,response:URLResponse?,error:Error?) -> VoID in //上传完毕 if error != nil{ print(error) }else{ let str = String(data: data!,enCoding: String.EnCoding.utf8) print("上传完毕:(str)") //str是包体 } }
小结: iOS对http/httpS交互封装个一套完整方便的API,主要涉及URLSession、URLSesionTask、URLCache及其派生类; 支持文件、上传/下载文件。
总结以上是内存溢出为你收集整理的Swift3.0 URLSession学习笔记全部内容,希望文章能够帮你解决Swift3.0 URLSession学习笔记所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)