1、网络请求方式的改变
1)NSURLConnection: iOS9之前使用
2)NSURLSession: iOS9 使用这个类
2、后台服务器传输协议由HTTP改成HTTPS
1)iOS开发 -> info.plist -> App Transport Security Settings ->Allow Arbitrary Loads -> YES
I
二、URL:
1、概念:
Uniform Resource Locator 统一资源定位符
2、结构
1、URL包含模式(或称协议)、服务器名称(或IP地址)、 路径和文件名
https :// www.baidu.com /img/bd_logo1.png
可以通过URL找到 服务器中的文件
URL中如果包含中文:
NSString *s = [urlString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
练习:通过连接加载图片
三、HTTP:
1、全称
Hypertext Transfer Protocol 超文本传输协议
https——用安全套接字层 传送的超文本传输协议
2、概念:
超文本传输协议是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种 发布和接收 HTML页面的方法。1960年美国人Ted Nelson构思了一种通过计算机处理文本信息的方法,并称之为超文本(hypertext),这成为了HTTP超文本传输协议标准架构的发展根基
是用于从WWW服务器传输超文本到本地浏览器的传输协议
3、通讯流程
1)首先客户端发送一个请求(request)给服务器
request由两部分组成:
请求头
请求体
2)服务器在接收到这个请求后将生成一个响应(response)返回给客户端
response由两部分组成:
相应头
相应体
4、常用请求方法
1) get 一般上请求数据时使用,直接将参数暴漏到url中,参数的长度有限制
2) post 一般上传数据时使用,将敏感的参数放到请求体中,在url中看不到,POST传递的数据量没有限制(具体还得看服务器的处理能力)
PS:get post的选择
1)如果要传递大量数据 比如文件上传 只能用POST请求
2)GET的安全性比POST要差些 如果包含机密\敏感信息 建议用POST
3)如果仅仅是索取数据(数据查询) 建议使用GET
4)如果是增加、修改、删除数据 建议使用POST
5、发送了一个请求 没有任何回应
1)没联网
2)请求内容错误:URL
练习:通过浏览器了解HTTP请求过程
四、JSON和XML
1、基本概念
查看博客 http://www.jianshu.com/p/5df890302416
2、JSON解析
[NSJSONSerialization JSONObjectWithData:nil options:NSJSONReadingMutableContainers error:nil];
NSJSONReadingMutableContainers:返回可变容器,NSMutableDictionary或NSMutableArray。
NSJSONReadingMutableLeaves:返回的JSON对象中字符串的值为NSMutableString,
NSJSONReadingAllowFragments:允许JSON字符串最外层既不是NSArray也不是NSDictionary,但必须是有效的JSON Fragment。例如使用这个选项可以解析 @“123” 这样的字符串
3、XML解析
1)准备工作
将GDataXMLNode文件加入至工程中
向Frameworks文件中添加libxml2.dylib库
在Croups & Files 侧边栏中双击工程图标,找到 build setting修改两个属性:
Search Paths中 找到Header Search Paths 将其对应的值修改为:/usr/include/libxml2,
在Linking中找到 Other Linker Flags 对应的值改为:-lxml2。
2) 读取xml文件
GDataXMLDocument *document = [[GDataXMLDocument alloc]initWithData:data error:nil];
3)获取到根节点
GDataXMLElement *rootElement = [document rootElement];
4)取出节点的属性值
[element attributeForName:@"id"]
4)根据节点取值
[rootElement elementsForName:@"from"]
练习:自己写JSON和XML串并解析
五、iOS下的HTTP请求过程
1、准备request
1)概念
iOS下使用NSURLRequest或者NSMutableURLRequest对象作为request,后者可以添加请求头
在请求中需要两个基本元素:
要加载的URL
加载的方式(默认是get)
如果需要,可以采用如下方式添加请求头、请求体
[request addValue:nil forHTTPHeaderField:nil]; //可变请求对象,才设置请求头
request.HTTPBody //请求体
2)request的缓存策略问题
不考虑缓存策略
+ (instancetype)requestWithURL:(NSURL *)URL;
- (instancetype)initWithURL:(NSURL *)URL
考虑缓存策略 超时限制
+ (instancetype)requestWithURL:(NSURL *)URL cachePolicy:(NSURLRequestCachePolicy)cachePolicy timeoutInterval:(NSTimeInterval)timeoutInterval
- (instancetype)initWithURL:(NSURL *)URL cachePolicy:(NSURLRequestCachePolicy)cachePolicy timeoutInterval:(NSTimeInterval)timeoutInterval
缓存策略的不同
默认的缓存策略 如果缓存不存在 直接从服务端获取 如果缓存存在 会根据response中的Cache-Control字段判断下一步操作
NSURLRequestUseProtocolCachePolicy,
忽略缓存 重新请求
NSURLRequestReloadIgnoringCacheData
有缓存就使用 不管其有效性 没有缓存就重新请求
NSURLRequestReturnCacheDataElseLoad
有缓存就用缓存 没有缓存就不发请求 当做请求出错处理(用于离线模式)
NSURLRequestReturnCacheDataDontLoad
3)缓存策略的选择,如果请求某个URL的返回数据
经常更新:不能用缓存 比如股票、彩票数据
一成不变:果断用缓存
偶尔更新:可以定期更改缓存策略 或者 清除缓存
提示:如果大量使用缓存 会越积越大 建议定期清除缓存
2、使用NSURLSession发送请求
1)创建一个NSURLSession对象,来帮助发送request请求
//数据请求,返回的是一个NSURLSessionDataTask对象,专门用来做数据类的网络请求任务
[session dataTaskWithRequest:nil completionHandler:nil];
//上传请求,返回的是一个NSURLSessionUploadTask对象,专门用来做上传类的网络请求任务
[session uploadTaskWithRequest:nil fromData:nil completionHandler:nil];
//下载请求,返回的是一个NSURLSessionDownloadTask对象,专门用来做下载类的网络请求任务
[session downloadTaskWithRequest:nil completionHandler:nil];
2)开始请求
[sessionTask resume];
3、获取响应头和相应体信息
//获取到相应头
NSHTTPURLResponse *httpResopnse = (NSHTTPURLResponse *)response;
//获取响应体
NSMutableDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
六:网络环境判断
Reachability
(1)导入类名
(2)创建对象 hostName尽量用一个稳定的网络
(3)添加观察者 接收网络环境发生改变的通知 通知的名字 kReachabilityChangedNotification
(4)开始检测
(5)在通知中得到 Reachability对象 not.object 获得网络环境的状态