Cocoa层HTTP请求共用的四类对象

iOS运用高层(Cocoa)API进行HTTP请求时都要使用的四类对象,分别是:NSURL、NSURLRequest、NSURLConnection、NSURLResponse。

1、NSURL

NSURL,Uniform Resource Locator,统一资源定位符。可以指向文件资源,或者网络资源。

引用两类资源的代码都类似,不同的是请求网络资源一般都在异步线程中。

代码如下:

1
2
NSURL *url = [NSURL URLWithString:urlText];
NSData *data = [NSData dataWithContentsOfURL:url];

需要注意的是当NSURL解析资源路径失败时就会初始化失败,对象为空。

非常方便的是NSURL提供了很多访问属性来读取URL各个部分的值。可参考:CocoaChina的NSURLComponents介绍Apple NSURL Class Reference

2、NSURLRequest

NSURLRequest可以说是URL加载系统中的请求体对象。包含了NSURL内容。默认的NSURLRequest独立于URL中指定的协议。

下面是最简单的NSURLRequest创建:

1
2
NSURL *url = [NSURL URLWithString:urlText];
NSURLRequest *request = [NSURLRequest requestWithURL:url];

如果请求的是网络资源并且网络协议是HTTP或HTTPS,那么将默认使用GET方式,并且使用系统默认的Header。NSURLRequest还提供了超时机制,如果超过设置的时间,系统将回调请求错误函数。

代码如下:

1
NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:30];

除了以上提供的类函数可以修改缓存策略,超时值等之外。iOS还提供了NSMutableURLRequest类来修改其他请求配置。

如发送POST请求,并设置HTTP体数据,可以用以下方法:

1
2
3
4
NSURL *url = [NSURL URLWithString:urlText];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"POST"];
[request setHTTPBody:[@"POST BODY" dataUsingEncoding:NSUTF8StringEncoding]];

当遇到上传本地文件的需求时,上述方法可能不太适用。涉及到文件网络传输的,一般都使用流来控制。iOS提供了下面的方法:

1
2
3
4
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
NSInputStream *inStream = [NSInputStream inputStreamWithFileAtPath:srcFilePath];
[request setHTTPBodyStream:inStream];
[request setHTTPMethod:@"POST"];

3、NSURLConnection

NSURLConnection是整个URL加载系统的中心。是客户端连接服务端的桥梁。

NSURLConnection详细介绍可参考另一篇文章:《iOS网络高级编程—网络功能(构建请求)》

4、NSURLResponse

当URL请求加载完成后,将产生NSURLResponse,并在回调函数中传回。当请求失败是,将产生NSError对象,NSURLResponse将不产生。

NSURLResponse附带了几种对象,其中需要注意的是URL可能不是请求时的URL,可能因为重定向、标准化等原因造成与请求URL不同。

iOS还提供了一个针对HTTP请求的NSHTTPURLResponse子类。包含了两个特定的属性:响应头和HTTP状态吗。

 

Cocoa层的URL加载系统基本涉及了以上对象。不得不说iOS提供了完善的机制。如果不满足业务需求的话,就得深入到CF层了。