网络小结

网络小结

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> 根据resultrangeAtIndex方法,获取到要抓取的内容
第一个括号对应的索引是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, idresponseObject))success
failure:(
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. 实例化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


作者:
出处:http://www.cnblogs.com/ChenYilong/(点击RSS订阅)
本文版权归作者和博客园共有,欢迎转载,
但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

原文地址:https://www.cnblogs.com/ChenYilong/p/3556241.html