NSURLConnection提供了简单的接口来创建和取消一个连接,并支持一个代理方法的集合来提供连接的响应,并对连接进行多方面的控制。这个类的方法可以分为5大类:URL加载、缓存管理、认证与证书、cookie存储、协议支持。
创建一个连接
NSURLConnection提供了三种方式来获取URL的内容:同步、异步使用完成处理器block、异步使用自定义的代理对象。
- 使用同步请求时,一般是在后台线程中独占线程运行,我们可以调用sendSynchronousRequest:returningResponse:error: 方法来执行HTTP请求。当请求完成或返回错误时,该方法会返回。
- 如果我们不需要监听请求的状态,而只是在数据完成返回时执行一些操作,则可以调用sendAsynchronousRequest:queue:completionHandler:方法来执行一个异步操作,其中需要传递一个block来处理结果。
- 我们也可以创建一个代理对象来处理异步请求,此时我们需要实现以下方法:connection:didReceiveResponse:、connection:didReceiveData:、connection:didFailWithError:和connectionDidFinishLoading: 。这些方法在NSURLConnectionDelegate、NSURLConnectionDownloadDelegate和 NSURLConnectionDataDelegate协议中定义。
代码清单1以代理对象异步请求为例,初始化了一个URL连接并实现代理方法来处理连接响应
|
|
发起一个POST请求
我们可以像发起其它URL请求一样,发起一个HTTP或HTTPS POST请求。主要的区别在于我们必须先配置好NSMutableURLRequest对象,并将其作为参数传递给initWithRequest:delegate:方法。
另外,我们还需要构造请求的body数据。可以以下面三种方式来处理
- 对于上传短小的内存数据,我们需要对已存在的数据块进行URL编码
- 如果是从磁盘中上传文件,则调用setHTTPBodyStream:方法来告诉NSMutableURLRequest从一个NSInputStream中读取并使用结果数据作为body的内容
- 对于大块的数据,调用CFStreamCreateBoundPair来创建流对象对,然后调用setHTTPBodyStream:方法来告诉NSMutableURLRequest使用这些流对象中的一个作为body内容的源。通过将数据写入其它流,可以一次发送一小块数据。
如果要上传数据到一个兼容的服务器中,URL加载系统同样支持100(继续)状态码,这样允许一个上传操作在发生认证错误或其它失败时仍能继续。为了开启这个操作,可以设置请求对象的expect头为100-continue。
代码清单2展示了如何配置一个POST请求的NSMutableURLRequest对象
|
|
使用Block来接收数据
NSURLConnection类提供了类方法sendAsynchronousRequest:queue:completionHandler:,该方法可以以异常的方式向服务端发起请求,并在数据返回或发生错误/超时时调用block来处理。该方法需要一个请求对象,一个完成处理block,及block运行的队列。当请求完成或错误发生时,URL加载系统调用该block来处理结果数据或错误信息。
如果请求成功,则会传递一个NSData对象和一个NSURLResponse对象给block。如果失败,则传递一个NSError对象。
这个方法有两个限制
- 对于需要认证的请求,只提供最小的支持。
- 没有办法来修改响应缓存和服务端重定向的默认行为。