网络小结
Posted on February 11th, 2014
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&error
NSData *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];
// * 将字符串转换成 NSData
request.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, id responseObject))success
failure:( void (^)(AFHTTPRequestOperation *operation, NSError *error))failure;
2 > 下载进度的块代码
- ( void )setDownloadProgressBlock:( void (^)(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead))block;
3 > 上传进度块代码
- ( void )setUploadProgressBlock:( void (^)(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite))block;
基本使用的核心代码
// 1. 实例化 AFHTTPClient
NSURL *url = [NSURL URLWithString: @"http://192.168.3.251/~apple/itcast" ];
_httpClient = [[AFHTTPClient alloc] initWithBaseURL:url];
// 2. 定义网络请求操作
// 1> NSURLRequest
NSURLRequest *request = [_httpClient requestWithMethod: @"GET" path: @"download/Objective-C2.0.zip" parameters: nil ];
// 2> AFHTTPRequestOperation => NSURLConnection
AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request];
// 3> 设置完成块代码,相比较 OC 的区别就在这里
setCompletionBlockWithSuccess
å
// 4> 启动操作
[_httpClient.operationQueue addOperation:op];
*/
在网络应用开发中,真正涉及到网络操作的代码,非常少!最主要的把
GET 方法
同步、异步
反序列化 JSON
就 OK 了