在iOS应用与HTTP服务器进行HTTP通信时,有3个主要的方法可以执行HTTP请求并接收响应。
NSURL *url = [NSURL urlWithString:@"..."];
NSData *data = [NSData dataWithContentOfURL:url];
注意,NSURL对象是不可变的,因此无法先创建空得NSURL对象再通过调用对象的赋值方法来装配其属性,对象要么通过另一个NSURL对象、要么通过NSString对象进行实例化。
NSURL *url = [NSURL urlWithString:@"..."];
NSRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10.0];
其中,cachePolicy:NSURLRequestReloadIgnoringCacheData指定了缓存策略,timeoutInterval指定了超时时间。
NSURL *url = [NSURL urlWithString:@"..."];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"POST"];
[request setHTTPBody:[@"Post body" dataUsingEncoding:NSUTF8StringEncoding]];
3、NSURLConnection
-(NSArray *) doSyncRequest:(NSString *)urlStr{
NSURL *url = [NSURL URLWithString:urlStr];
NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:10.0];
NSHTTPURLResponse *response;
NSError *err = nil;
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err];
NSDictionary *dict = [XMLReader dictionaryForXMLData:data error:&err];
NSArray *entries = [self getEntriesArray:dict];
return entries;
}
二、队列式异步请求
该请求类似于同步请求,它们的主要区别在于URL加载执行的队列式异步请求位于队列中,可能在后台线程中。在创建队列式异步请求前,首先需要创建队列,队列中是执行的请求。
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
操作队列可以并发执行多个操作,一般地,并发操作数量由iOS系统决定,也可以调用setMaxConcurrentOperationCount:方法来重写默认值。
当应用启动时,一个队列就会自动创建,可以通过调用NSOperationQueue的mainQueue类方法来获取该队列,但是需要注意 不要在该队列执行网络请求,这样会阻塞主线程。
-(void) doQueueAsyncRequest:(NSString *)urlStr delegate:(id)delegate{
NSURL *url = [NSURL URLWithString:urlStr];
NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:10.0];
if (queue == nil) {
queue = [[NSOperationQueue alloc] init];
}
[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *err){
if (err != nil) {
}else{
if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
if (httpResponse.statusCode != 200) {
return ;
}
}
NSDictionary *dict = [XMLReader dictionaryForXMLData:data error:&err];
NSArray *entries = [self getEntriesArray:dict];
if ([delegate respondsToSelector:@selector(setVideos:)]) {
[delegate performSelectorOnMainThread:(setVideos:) withObject:entries waitUntilDone:YES];
}
}
}];
}
上述代码中,如果HTTP的状态码为200,说明请求成功,并将返回的数据解析到NSDictionary对象中,然后,代码验证所提供的委托类支持setVideo:方法,如果支持,就会在主线程中执行该方法。-(void)start{
NSURL *url = [NSURL URLWithString:srcURL];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
self.conn = [NSURLConnection connectionWithRequest:request delegate:self];
[self.conn start];
}
下面看看上图所示的几个委托方法
-(NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)response{
NSLog(@"Redirect request for %@ redirecting to %@", srcURL, request.URL);
NSLog(@"All headers = %@", [(NSHTTPURLResponse *)redirectResponse allHeaderFields]);
// 重定向
return request;
}