网络小结

网络小结


1. 网络访问的数据类型:
* JSON
特点:
     [] 表示数组
     {} 表示字典 - 对象模型建立关系
应用非常多,基本上移动开发的主要数据传输都是JSON

要使用JSON,从网络上获取到数据之后使用:

     [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];

可以将网络数据反序列化为字典或者数组,具体转换类型,看JSON最外面的一个括号

===================================================================

* XML
特点:大,解析费劲
提示:因为使用的少,可以不要求掌握,等碰到时再去翻看视频及PPT中的流程图

要启动XML解析需要
===================================================================
// 1) 实例化解析器
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
// 2) 设置代理
parser.delegate = self;
// 3)开始解析
[parser parse];
===================================================================
     XML解析的六个代理方法
说明:
// 1. 开始解析文档,在这里做初始化工作

1. 解析准备工作

2.3.4 三个步骤会循环执行,一直到所有的节点解析完成

2步解析一个节点,即节点中的字典
3步负责拼接字符串
4步节点解析完成,可以用KVC直接设置对象内容

5. 用于收尾工作
6. 解析出错,需要把中间数据清除,以免造成不必要的错误

推荐技巧,可以将所有的属性设置到一个节点中的属性节点中,如此只需要第二步即可。

格式如下:
"12" index="1"]] ]]> 
<item< span="">id="1558" title="错入豪门" tag="都市言情"source="/upload/file/2013_07_4/2013718101155179.zip"author="唯一的迷蝶" updatetime="2013-6-21 11:06:17"summary="新婚之夜、她..." clicks="86945" words=""logo="/upload/pic/2013_06_5/20136211172503.png"jx="False" />



- (void)parserDidStartDocument:(NSXMLParser *)parser
// 2. 解析一个节点
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
// 3. 查找节点内容,可能会多次
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
// 4. 节点完成
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
// 5. 解析完成,做收尾工作
- (void)parserDidEndDocument:(NSXMLParser *)parser
// 6. 解析出错,清理中间数据
- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError


===================================================================
* HTML
通常用于自己没有服务器,或者某些网络资源确实非常重要!可以实现抓取以备不时之需。

例如:省、市、地区、邮政编码、身份证的前6位归属

要使用HTML可以利用正则表达式进行解析,具体使用可以参见今天示例程序中NSString+Regex.h

提示:以后使用可以直接在分类代码基础上使用,自行编写匹配方案即可。

要使用正则表达式步骤

1> 指定匹配方案
* 打开网页源代码,找到需要抓取的部位
* 将前后标记一起复制到代码中,然后用(.*?)替代我们需要抓到的内容即可
* 匹配方案必须要能够和页面内容唯一匹配

2> 实例化正则表达式,需要指定两个选项
NSRegularExpressionCaseInsensitive      忽略大小写
NSRegularExpressionDotMatchesLineSeparators .能够匹配换行

3]] ]]> 
* 使用firstMatchInString查找第一个与匹配方案相同的内容
* 使用matchesInString可以查找多个与匹配方案相同的内容,通常用在 在html里面标示无符号的序列在html里面标示数字的序列4> 根据result的rangeAtIndex方法,获取到要抓取的内容第一个括号对应的索引是1,第二个是2,依次类推5> 根据range,使用字符串的substringWithRange方法,可以获得准确的内容在正则表达式中,需要做出错处理,因为如果方案书写不正确,regex是不能被实例化的===================================================================* 网络访问中的方法:1]] ]]> GET// 1. 定义URL,确定要访问的地址NSURL *url = [NSURL URLWithString:urlString];// 2. 定义URLRequest,确定网络访问请求,在GET方法中直接用URL即可NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:2.0f];===================================================NSURLResponse *response = nil;NSError *error = nil;// 同步请求的应用场景:例如:网银账户的登录!// 一定要获取到某个网络返回数据后,才能进行下一步操作的场景!// 发送同步请求,respone&error要带地址的原因就是为了方法执行后,能够方便使用response&errorNSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];===================================================// 异步方法[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {// 块代码的内容会在网络访问后执行// 块代码是预先定义好的代码片段,在满足某个条件时执行的。     NSLog(@"%@", [NSThread currentThread]);}];===================================================2]] ]]> POST// 1. 定义URL,确定要访问的地址NSURL *url = [NSURL URLWithString:urlString];// 2. 定义请求,生成数据体添加到请求NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];// 1) 指定网络请求的方法request.HTTPMethod = @"POST";// 2) 生成数据体// * 先生成字符串NSString *bodyStr = [NSString stringWithFormat:@"username=%@&password=%@", userName, password];// * 将字符串转换成NSDatarequest.HTTPBody = [bodyStr dataUsingEncoding:NSUTF8StringEncoding];// 提示:POST请求多用于用户登录,或者上传文件,在实际开发中,“POST请求的参数及地址”需要与公司的后端程序员沟通。// POST同样具备同步和异步方法===================================================================* AFNetworking      AFN第三方网络框架// 应用场景,针对"大"的文件下载以及文件上传// 目前还有非常多公司在使用此框架!AFN使用步骤1. 定义成员变量,记录AFN的客户端,使用BaseURL初始化该客户端会同时实例化一个操作队列,以便于后续的多线程处理     AFHTTPClient *_httpClient;2. 定义AFHTTPRequestOperation,并且定义其中的操作即可     AFHTTPRequestOperation是对NSURLConnection的封装提供有三个块代码:1> 完成操作的块代码- (void)setCompletionBlockWithSuccess:(void (^)(AFHTTPRequestOperation *operation, idresponseObject))successfailure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure;2> 下载进度的块代码- (void)setDownloadProgressBlock:(void (^)(NSUInteger bytesRead, long long totalBytesRead, long longtotalBytesExpectedToRead))block;3> 上传进度块代码- (void)setUploadProgressBlock:(void (^)(NSUInteger bytesWritten, long long totalBytesWritten, long longtotalBytesExpectedToWrite))block;基本使用的核心代码// 1. 实例化AFHTTPClientNSURL *url = [NSURL URLWithString:@"http://192.168.3.251/~apple/itcast"];_httpClient = [[AFHTTPClient alloc] initWithBaseURL:url];// 2. 定义网络请求操作// 1> NSURLRequestNSURLRequest *request = [_httpClient requestWithMethod:@"GET" path:@"download/Objective-C2.0.zip" parameters:nil];// 2> AFHTTPRequestOperation => NSURLConnectionAFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request];// 3> 设置完成块代码,相比较OC的区别就在这里setCompletionBlockWithSuccesså// 4> 启动操作[_httpClient.operationQueue addOperation:op];*/在网络应用开发中,真正涉及到网络操作的代码,非常少!最主要的把     GET方法同步、异步反序列化JSON就OK了

原文地址:https://www.cnblogs.com/A--G/p/4812282.html