一、iOS9 网络编程的重大改变:
1、网络请求方式的改变
1)NSURLConnection: iOS9之前使用 2)NSURLSession: iOS9 使用这个类
2、后台服务器传输协议由HTTP改成HTTPS(使用网络服务器请求一定要配置,下面是配置方法)
1)iOS开发 -> info.plist ->右键AddRow->(输入APP)选择 App Transport Security Settings ->Allow Arbitrary Loads -> YES
二、URL(包括:模式(或称协议)、服务器名称(或IP地址:数字不好记)、 路径和文件名)
1、概念: Uniform Resource Locator 统一资源定位符 2、结构 1、URL包含模式(或称协议)、服务器名称(或IP地址:数字不好记)、 路径和文件名 https :// www.baidu.com(172.0.0.1域名都是服务器名称) /img/bd_logo1.png 可以通过URL找到 服务器中的文件 URL中如果包含中文:(将中文转化) 将中文转化的好处是:NSLog(@"%@",[url host]);//获取到服务器名字 NSLog(@"%@",[url path]); 获取到路径 NSString *s = [urlString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
三、HTTP:(超文本传输协议)
1、全称 Hypertext Transfer Protocol 超文本传输协议 https——用安全套接字层 传送的超文本传输协议//更加安全 2、概念: 超文本传输协议是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种 发布和接收 HTML 页面的方法。1960年美国人Ted Nelson构思了一种通过计算机处理文本信息的方法,并称之为超文本(hypertext),这成为了HTTP超文本传输协议标准架构的发展根基 是用于从WWW服务器传输超文本到本地浏览器的传输协议 3、通讯流程(是用于从WWW服务器传输超文本到本地浏览器的传输协议) 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 3) 问一下后台是否有错
四、iOS下的HTTP请求过程
1、准备request 1)概念 iOS下使用NSURLRequest或者NSMutableURLRequest对象作为request,后者可以添加请求头 在 请求中需要两个基本元素 (1)要加载的URL (如果URL里面有中文需要转化) (2)加载的方式(默认是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];
五、JSON和XML(建议使用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"]
六.具体的一个完整的代码
pragma mark 网络请求
/* * HTTP:是一种超文本传输协议 * 通讯流程: 1、发送请求到服务器 2、服务器根据请求的内容做相应的响应 * */ /* * 请求中必须要用的内容 1、url http://apis.baidu.com/apistore/weatherservice/citylist?cityname 2、请求方式(get和post) GET * 可有可无的 1、请求头 apikey 2、请求体 */ //准备一个url并且给上一个请求参数 NSURL *urlString = [NSURL URLWithString:@"http://apis.baidu.com/apistore/weatherservice/weather?citypinyin=zhengzhou"]; //创建出来一个可变的请求对象 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:urlString]; //建一个请求方式 request.HTTPMethod = @"GET"; //设置请求超时 //request.timeoutInterval = 5; //*****上面两步是必须做的****/ //设置请求头,前面是请求头的参数,后面是参数名 [request addValue:@"076cbce61ccaa7b7d304c23f24e54790" forHTTPHeaderField:@"apikey"];
pragma mark 发送请求
//获取到NSURLSession的单利对象 NSURLSession *session = [NSURLSession sharedSession]; NSURLSessionDataTask *sessionDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { //数据请求成功调用 NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];//NSJSONReadingMutableContainers返回的数组或者字典是可变的//NSJSONReadingMutableLeaves返回的字符串是可变的// NSJSONReadingAllowFragments既不是数组也不是字符串 NSLog(@"%@",dictionary); //获取到响应头信息(上传下载的时候用) NSHTTPURLResponse *httpresponse = (NSHTTPURLResponse *)response; NSDictionary *responseDict = httpresponse.allHeaderFields; NSLog(@"%@",responseDict); }];
//真正开始请求
[sessionDataTask resume];
七:网络环境判断(需要框架)
Reachability (1)导入类名 (2)创建对象 hostName尽量用一个稳定的网络 (3)添加观察者 接收网络环境发生改变的通知 通知的名字 kReachabilityChangedNotification (4)开始检测 (5)在通知中得到 Reachability对象 not.object 获得网络环境的状态