• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Swift3.0 URLSession学习笔记

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
因为iOS的权限限制, 如果使用HTTP协议要配置info.plist, 将Allow Arbitary Loads设为YES。

屏幕快照 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。


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

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.30009
http返回, 时间:1484230881.42724

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

code 200
Server - Apache
Content-Type - application/json
Transfer-Encoding - Identity
Date - Thu, 12 Jan 2017 14:21:21 GMT
Proxy-Connection - Keep-alive
Tracecode - 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, downloadTask: URLSessionDownloadTask, 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及其派生类; 支持文件、上传/下载文件。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap