您的位置:首页 > 理论基础 > 计算机网络

20.网络

2016-03-19 09:35 686 查看

网络

HTTP请求

GET请求

NSString *urlStr = @"http://xxxxx.com";
urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *url = [NSURL URLWithString:urlStr];
// 请求
NSURLRequest *request = [NSURLRequest requestWithURL:url];


POST请求

NSString *urlStr = @"http://xxxxx.com";
urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *url = [NSURL URLWithString:urlStr];
// 请求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.HTTPMethod = @"POST";
request.HTTPBody = [@"username=123&pwd=123" dataUsingEncoding:NSUTF8StringEncoding];


数据解析

JSON

NSJSONSerialization

XML

SAX: NSXMLParser

DOM: GDataXML

NSURLConnection(iOS9已经过期)

发送同步请求

+ (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error;
// 这个方法是阻塞式的,会在当前线程发送请求
// 当服务器的数据完全返回时,这个方法才会返回,代码才会继续往下执行


发送异步请求-block

+ (void)sendAsynchronousRequest:(NSURLRequest*) request
queue:(NSOperationQueue*) queue
completionHandler:(void (^)(NSURLResponse* response, NSData* data, NSError* connectionError)) handler;
// 会自动开启一个子线程去发送请求
// 当请求完毕(成功\失败),会自动调用handler这个block
// handler这个block会放到queue这个队列中执行


发送异步请求-delegate

创建NSURLConnection对象

// startImmediately==YES,创建完毕后,自动发送异步请求
- (instancetype)initWithRequest:(NSURLRequest *)request delegate:(id)delegate startImmediately:(BOOL)startImmediately;
- (instancetype)initWithRequest:(NSURLRequest *)request delegate:(id)delegate; // 创建完毕后,自动发送异步请求
+ (NSURLConnection*)connectionWithRequest:(NSURLRequest *)request delegate:(id)delegate; // 创建完毕后,自动发送异步请求


发送请求

[connection start];


遵守
NSURLConnectionDataDelegate
协议,实现协议中的代理方法

// 当接收到服务器的响应时就会调用
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;
// 每当接收到服务器返回的数据时就会调用1次(数据量大的时候,这个方法就会被调用多次)
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;
// 当服务器的数据完全返回时调用(服务器的数据接收完毕)
- (void)connectionDidFinishLoading:(NSURLConnection *)connection;

// 当请求失败的时候调用
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;


取消请求

[connection cancel];


NSString和NSData的互相转换

NSString -> NSData

NSData *data = [@"qweq" dataUsingEncoding:NSUTF8StringEncoding];


NSData -> NSString

NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];


字典转模型框架

Mantle

所有模型都必须继承自MTModel

JSONModel

所有模型都必须继承自JSONModel

MJExtension

不需要强制继承任何其他类

设计框架需要考虑的问题

侵入性

侵入性大就意味着很难离开这个框架

易用性

比如少量代码实现N多功能

扩展性

很容易给这个框架增加新框架

JSON的解析方式

在iOS中,JSON的常见解析方案有4种

第三方框架:JSONKit、SBJson、TouchJSON(性能从左到右,越差)

苹果原生(自带):NSJSONSerialization(性能最好)

NSJSONSerialization的常见方法

JSON数据 > OC对象

+ (id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error


OC对象 > JSON数据

+ (NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)error


XML的解析方式

XML的解析方式有2种

DOM:一次性将整个XML文档加载进内存,比较适合解析小文件

SAX:从根元素开始,按顺序一个元素一个元素往下解析,比较适合解析大文件

在iOS中,解析XML的手段有很多

苹果原生 NSXMLParser:SAX方式解析,使用简单

第三方框架

libxml2:纯C语言,默认包含在iOS SDK中,同时支持DOM和SAX方式解析

GDataXML:DOM方式解析,由Google开发,基于libxml2

XML解析方式的选择建议

大文件:NSXMLParser、libxml2

小文件:GDataXML、NSXMLParser、libxml2

NSXMLParser的用法

创建解析器来解析

// 创建XML解析器
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
// 设置代理
parser.delegate = self;
// 开始解析XML(parse方法是阻塞式的)
[parser parse];


代理对象要遵守NSXMLParserDelegate协议,实现代理方法

NSXMLParser采取的是SAX方式解析,特点是事件驱动,下面情况都会通知代理

当扫描到文档(Document)的开始与结束

当扫描到元素(Element)的开始与结束

//解析到某个元素的开头(比如解析<videos>)
- (void)parser:(NSXMLParser *)parser didStartElement:    (NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
}
//解析到某个元素的结尾(比如解析</videos>)
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{}
//开始解析XML文档
- (void)parserDidStartDocument:(NSXMLParser *)parser
{}
//解析完毕
- (void)parserDidEndDocument:(NSXMLParser *)parser{}


GDataXML的使用

配置

GDataXML基于libxml2库,得做以下配置

导入libxml2库



设置libxml2的头文件搜索路径(为了能找到libxml2库的所有头文件)

在Head Search Path中加入/usr/include/libxml2

设置链接参数(自动链接libxml2库)

在Other Linker Flags中加入-lxml2

由于GDataXML是非ARC的,因此得设置编译参数



具体用法

// 加载整个文档
GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil];
// 获得根节点
doc.rootElement;
// 获得其他节点
[element elementsForName:@"video"];
// 获得节点的属性
[element attributeForName:@"name"].stringValue;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  网络 url