这篇文章主要讲述苹果提供的NSURLConnectione和NSURLRequest网络请求API来请求网络数据的基本用法。
一、网络请求的步骤
1.构造地址NSURL
2.构造请求NSURLRequest
3.构造启动连接NSURLConnection
4.发送同步请求\异步请求
5.代理对象实现协议,用于监听通讯事件
NSURLConnection 通讯协议
1.NSURLConnectionDelegate
2.NSURLConnectionDataDelegate
NSURLConnectionDownloadDelegate 子协议
我们根据同步请求\异步请求来分别讲述介绍他们的基本用法
二、同步请求
//1.构造地址NSURL NSURL *url = [NSURL URLWithString:@"http://piao.163.com/m/cinema/list.html?app_id=1&mobileType=iPhone&ver=2.6&channel=appstore&deviceId=9E89CB6D-A62F-438C-8010-19278D46A8A6&apiVer=6&city=110000"]; //2.构造请求NSURLRequest // NSURLRequest : 不可变请求对象,不能动态添加请求信息 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; //2.1> 请求方式 [request setHTTPMethod:@"GET"]; //2。2> 超时时间 [request setTimeoutInterval:60]; //2.3> 设置请求头信息 // [request setAllHTTPHeaderFields:<#(NSDictionary *)#>] // [request setValue:<#(NSString *)#> forHTTPHeaderField:<#(NSString *)#>]; // [request addValue:<#(NSString *)#> forHTTPHeaderField:<#(NSString *)#>]; //2.4> 设置请求体 // [request setHTTPBody:<#(NSData *)#>]; //2.5>设置请求头,告诉服务器数据需要压缩 [request setValue:@"gzip" forHTTPHeaderField:@"Accept-Encoding"]; //2.6> 设置缓存 [request setCachePolicy:NSURLRequestReturnCacheDataElseLoad]; //3.构造NSURLConnection NSHTTPURLResponse *response = nil; NSError *error; //4.发送同步请求 //(NSError **)error 像这样的双指针参数,需要用&符号取得变量的地址传入 NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; //5.解析数据 //5.1将data转成字符串 NSString *jsonstring = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"jsonstring = %@",jsonstring); //5.2解析JSON NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil]; NSLog(@"数据结果:%@",dic); //6.取得响应的信息 //取得状态码 NSInteger statusCode = response.statusCode; //取得所有的响应头 NSDictionary *headerFields = response.allHeaderFields; NSLog(@"statusCode = %d",statusCode); NSLog(@"headerFields = %@",headerFields);
三、异步请求
方式一:
//1.构造URL NSURL *url = [NSURL URLWithString:@"http://piao.163.com/m/cinema/schedule.html?app_id=1&mobileType=iPhone&ver=2.6&channel=appstore&deviceId=9E89CB6D-A62F-438C-8010-19278D46A8A6&apiVer=6&city=110000"]; //2.构造Request NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; [request setHTTPMethod:@"POST"]; [request setTimeoutInterval:60]; //3.添加请求体数据 NSString *parasText = @"cinema_id=1533"; NSData *data = [parasText dataUsingEncoding:NSUTF8StringEncoding]; //设置请求体数据 [request setHTTPBody:data]; //4.构造NSURLConnection //connectionWithRequest : 创建NSURLConnection对象,同事发送异步请求 [NSURLConnection connectionWithRequest:request delegate:self]; /* NSURLConnection 通讯协议 1.NSURLConnectionDelegate 2.NSURLConnectionDataDelegate NSURLConnectionDownloadDelegate 子协议 */
请求调用的协议方法
#pragma mark - NSURLConnection 协议方法 //1. 接受到服务器的响应 - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { //取得响应对象 NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; NSDictionary *fields = httpResponse.allHeaderFields; NSLog(@"%@",fields); self.receiveData = [[NSMutableData alloc] init]; } //2.接受服务器传输的数据,数据量大时,会被调用多次,因为数据是分批传输的 //在此协议方法中可以监听数据传输的进度 - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { //对每次传输的数据进行拼接 [self.receiveData appendData:data]; NSLog(@"接受了%d字节的数据",data.length); } //3.接受数据完成 - (void)connectionDidFinishLoading:(NSURLConnection *)connection { NSString *jsonString = [[NSString alloc] initWithData:self.receiveData encoding:NSUTF8StringEncoding]; _textView.text = jsonString; //解析JSON } //4.请求失败调用的协议方法 - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { NSLog(@"网络请求错误:%@",error); }
方式二:
//1.构造URL NSURL *url = [NSURL URLWithString:@"http://piao.163.com/m/cinema/schedule.html?app_id=1&mobileType=iPhone&ver=2.6&channel=appstore&deviceId=9E89CB6D-A62F-438C-8010-19278D46A8A6&apiVer=6&city=110000"]; //2.构造Request NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; [request setHTTPMethod:@"POST"]; [request setTimeoutInterval:60]; //3.添加请求体数据 NSString *parasText = @"cinema_id=1533"; NSData *data = [parasText dataUsingEncoding:NSUTF8StringEncoding]; //设置请求体数据 [request setHTTPBody:data]; NSOperationQueue *queue = [[NSOperationQueue alloc] init]; //使用如下方式发送异步请求,无法监听数据传输,也不能监听传输的进度 /** * * @param request * @param queue 队列,请求线程会被添加到此队列中 * @param completionHandler 数据请求完成之后,调用此block, 这个block是多线程调用的 * */ [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { //多线程调用 NSString *jsonString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; //回到主线程刷新UI dispatch_sync(dispatch_get_main_queue(), ^{ // _textView.text = jsonString; NSLog(@"jsonString = %@",jsonString); }); }];