iOS中我们可以通过NSURLRequest和NSURLConnection来建立一些HTTP请求下载数据等等
先看一个例子:
NSURLRequest *theRequest=[NSURLRequest requestWithURL: [NSURL URLWithString:@“http://www.baidu.com/”] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0]; NSURLConnection *theConnection[[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; if(theConnection) { //创建NSMutableData receivedData=[[NSMutableData data] retain]; }else // 创建失败
先创建一个NSURLRequest,设置好URL和cachePolicy,timeoutInterval。
cachePolicy有以下几种:
NSURLRequest默认的cache policy是NSURLRequestUseProtocolC achePolicy, 是最能保持一致性的协议。
NSURLRequestReloadIgnori ngCacheData 忽略缓存直接从原始地址下载
NSURLRequestReturnCacheD ataElseLoad 只有在cache中不存在data时才从原始地址下载
NSURLRequestReturnCacheD ataDontLoad 允许app确定是否要返回cache数据,如果使用这种协议当本地不存在response的时候,创建NSURLConnection or NSURLDownload实例时将会马上返回nil;这类似于离线模式,没有建立网络连接;
然后通过NSURLRequest来构建NSURLConnection,设置delegate,通过返回的theConnection 来判断是否创建成功。
其中delegate要实现一下几个方法:供NSURLConnection来回调
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { // This method is called when the server has determined that it // has enough information to create the NSURLResponse. // It can be called multiple times, for example in the case of a // redirect, so each time we reset the data. // receivedData is an instance variable declared elsewhere. [receivedData setLength:0]; }
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { // Append the new data to receivedData. // receivedData is an instance variable declared elsewhere. [receivedData appendData:data]; }
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { // release the connection, and the data object [connection release]; // receivedData is declared as a method instance elsewhere [receivedData release]; // inform the user NSLog(@"Connection failed! Error - %@ %@", [error localizedDescription], [[error userInfo] objectForKey:NSURLErrorFailingURLStringErrorKey]); }
- (void)connectionDidFinishLoading:(NSURLConnection *)connection { // do something with the data // receivedData is declared as a method instance elsewhere NSLog(@"Succeeded! Received %d bytes of data",[receivedData length]); // release the connection, and the data object [connection release]; [receivedData release]; }
NSURLConnect还提供了一个方便的类方法(class method) : sendSynchronousRequest:returningResponse:error:可用来
+ (NSData *)sendSynchronousRequest: (NSURLRequest *)request returningResponse: (NSURLResponse **)response error: (NSError **)error
- request 要装载的URL请求. 这个request 对象 作为初始化进程的一部分,被深度复制(deep-copied). 在这个方法返回之后, 再修改request, 将不会影响用在装载的过程中的request
- reponse 输出参数, 由服务器返回的URL响应
- error
输出参数, 如果在处理请求的过程中发生错误,就会使用. 无错误,就为NULL