高层iOS HTTP API

来源:互联网 发布:onavo mac版 编辑:程序博客网 时间:2024/04/30 16:21
<span style="font-family: Arial, Helvetica, sans-serif;">NSURL *url = [NSURL urlWithString:mysteryString];</span>
NSData *data = [NSData dataWithContentsOfURL:url];

mysteryString的值可以引用文件或网络资源,而代码行为是一样的。主要的差别在于加载mysteryString所引用资源的时间上。如果URL引用的是网络资源,就会在后台线程中执行代码,这样在数据加载时用户界面就不会暂停下来。

根据RFC3986的要求,在创建NSURL对象前,URL字符串的内容需要以百分号编码。

NSURL对象是不可变的,这意味着无法先构建空的NSURL对象,然后通过调用对象的赋值方法来装配其属性。对象要么通过NSString对象,要么通过另一个NSURL对象实例化。


NSURLRequest

NSURLRequest对象包含了加载URL内容所需的信息,并且独立于URL中指定的协议。ios中URL加载系统支持HTTP,HTTPS,FTP与File URL内容的加载。URL加载系统提供了一种扩展方式以处理新的协议,方式是创建NSURLProtocol的子类,然后将返回结果提供给URL加载系统。创建NSURLRequest对象最简单的方式是使用类方法和提供的NSURL对象。

使用默认值表示请求使用URL协议指定的请求缓存规则,请求有着标准的请求超时。如果URL是HTTP或HTTPS,那么请求方法是GET,并且使用操作系统提供的默认头。

下述示例展示了如何使用自定义的缓存与超时值来创建NSURLRequest对象。构建URL加载系统的代码忽略了所有缓存,如果完成请求连接的时间超过20秒,将会生成错误。

NSURL *url = [NSURL URLWithString:@"https:www.test.com"];if (url == nil){    NSLog(@"Invalid URL");    return;}NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:20.0];if (request == nil){    NSLog(@"");    return;}

NSURLRequest 对象提供了几个访问器方法来获取请求的属性,由于NSURLRequest类是不可变的,因此无法修改这些属性。除了URL,缓存策略与超时值外,如果要修改其他属性,那么请使用NSMutableURLRequest类。


下述代码片段展示了使用一小段消息体来创建一个简单的POST请求,它包含了以UTF8编码的一个NSString对象的字节。URL加载系统会自动装配请求的Content-Length头。

NSURL * url = [NSURL urlWithString:@"http://www.test.com"];NSMutableURLRequest * req = [NSMutableURLRequest requestWithURL:url];[req setHTTPMethod:@"POST"];[req setHTTPBody:[@"Post body" dataUsingEncoding:NSUTF8StringEncoding]];

有两种方式可以向NSURLRequest提供HTTP体:在内存中(上例)或NSInputStream。

代码可以通过输入流请求体而无须将整个体加载到内存中。下例:

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];NSInputStream *stream = [NSInputStream inputStreamWithFileAtPath:srcFilePath];[request setHTTPBodyStream:steam];[request setHTTPMethod:@"POST"];

因为NSURLRequest 对象包含HTTP与非HTTP请求的属性,因此访问非HTTP URL的代码需要将特定于HTTP的属性的值设为nil。


NSURLConnection

NSURLConnection对象时URL加载系统活动的中心,但提供的接口不多,只提供了初始化,开启与取消连接的方法。

通过三种不同的操作模式发挥作用:同步,异步与队列式异步。

同步:易于使用,不过有很多限制,不适合更加高级的交互。

异步:很大灵活性,不过增加了代码的复杂性。

队列式异步:提供异步模式的后台操作,同时保持同步模式的简单行。


NSURLResponse

NSURLResponse对象会在URL加载请求完毕后返回。

如果生成了NSError对象,就不会再生成NSURLResponse与NSData对象。

MIMEType-结果数据的MIME类型。该值来源于服务器,如果客户端框架认为服务器有错,那么可以修改,如果服务器没有提供,还可以由客户端框架提供。

expectedContentLength-该值可能由请求返回,也可能不返回,返回值可能与返回内容实际大小不同,如果返回内容大小未知,那么该值将等于NSURLResponseUnknownLength。

suggestedFileName-要么是服务器提供的内容文件名,要么来自于URL和MIME类型。

URL-返回内容的URL。由于重定向和标准化等原因,该URL可能与请求提供的URL不同。

textEncodingName-最初的数据源所用的文本编码名,如果响应中没有使用文本编码,那么该值为nil

URL加载系统提供了一个名为NSHTTPURLResponse的NSURLResponse的子类,它包含特定于HTTP请求的属性。该类对于HTTP请求的结果是必须的。它有如下额外的参数:

响应头:该属性返回响应头值的NSDictionary对象。字典的键是头的名字,键对应的值是头的值。HTTP规范允许一个请求有多个同名的头。NSHTTPURLResponse通过返回一个包含所有头值的NSString对象(头值之间用逗号分割)来处理这一点。

HTTP状态码:来自于响应状态行的整数状态码。NSHTTPURLResponse类有一个类方法可以针对任意状态码返回本地化的字符串说明。



0 0
原创粉丝点击