iOS网络编程(一)NSURLConnection

最后更新于:2022-04-01 22:59:07

**1.访问网络的方式** **@同步请求:数据的请求在主线程来执行,一旦发送同步请求,程序将停止用户交互,直至服务器返回数据完成,才可以进行下一步操作,而网络数据加载需要一个时间过程,这样的话就会堵塞主线程.** **@异步请求:数据的请求过程在多线程执行** **@其他区别:同步请求无法取消,异步请求过程中可以取消;同步请求无法监听加载进度,异步可以监听** **2.主要请求方式:** **@GET请求:将参数直接写在访问路径上,操作简单,但是容易被外界看到,安全性不高,而且有长度限制,地址最多255字节** **@POST请求:将参数放到body里面.POST请求操作相对复杂,需要将参数和地址分开,不过安全性高,参数放在body里面不容易被捕获** **3.基本流程:** **@构造NSURL实例(将需要请求的数据的网址字符串转化成NSURL对象)** @生成*NSURLRequest*请求(不可变,一般用*NSMutableURLRequest*) **@通过NSURLConnection发送请求** **@通过返回*NSURLResponse*实例和*NSError*实例分析结果** **@接受返回数据** **4.NSURL(**NSURL实例包装了一个地址信息,可以是本地地址,也可以是远程地址) ~~~ // 初始化URL实例 NSURL * url = [NSURL URLWithString:@"http://www.baidu.com:8080/search?id=1"]; // http NSLog(@"Scheme:%@",[url scheme]); // www.baidu.com NSLog(@"Host:%@",[url host]); // 端口8080 NSLog(@"Port:%@",[url port]); // http://www.baidu.com:8080/search?id=1 NSLog(@"absoluteString:%@",[url absoluteString]); // /search NSLog(@"relativePath:%@",[url relativePath]); // /search NSLog(@"Path:%@",[url path]); // ("/",search ) NSLog(@"pathComponents:%@",[url pathComponents]); // id=1 NSLog(@"Query:%@",[url query]); ~~~ **5.NSURLRequest和NSMutableURLRequest** ~~~ @NSURLRequest 包装了网络请求的信息 NSURL * url = [NSURL URLWithString:urlString]; // 设置后不能改变 NSURLRequest * request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0]; @NSMutableURLRequest @便利构造器方法(方便,其他参数另行设置) NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0]; // 请求方式默认是GET,可以不设置 [request setHTTPMethod:@"GET”]; @实例方法 NSMutableURLRequest * request = [[NSMutableURLRequest alloc]init]; // 设置超时时间 [request setTimeoutInterval:60.0]; // 设置请求参数(POST才有请求体,必设) [request setHTTPBody:_data]; // 参数cachePolicy NSURLRequest默认的cache policy是NSURLRequestUseProtocolCachePolicy, 是最能保持一致性的协议。 NSURLRequestReloadIgnoringCacheData 忽略缓存直接从原始地址下载 NSURLRequestReturnCacheDataElseLoad 只有在cache中不存在data时才从原始地址下载 NSURLRequestReturnCacheDataDontLoad 允许app确定是否要返回cache数据,如果使用这种协议当本地不存在response的时候,创建NSURLConnection or NSURLDownload实例时将会马上返回nil;这类似于离线模式,没有建立网络连接; ~~~ **6.同步--->GET请求** ~~~ - (void)onClickBoysPostButton{ // 要求的地址 NSString * urlString = @"http://project.lanou3g.com/teacher/yihuiyun/phpXML.php?sex=男"; // 将地址编码(把 sex=男 转换成 sex=%E7%94%B7) NSString *str = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; // 1.将网址字符串封装为NSURL对象 NSURL * url = [NSURL URLWithString:str]; // 网络请求设置 NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0]; // 请求方式默认是GET [request setHTTPMethod:@"GET"]; // 2.连接服务器 // Response对象,用来得到返回后的数据,比如,用statusCode==200 来判断返回正常 NSHTTPURLResponse *response; NSError * error = nil; // 3. 返回数据 NSData * data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; // NSData转化NSString 用的是实例方法 NSString * string = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"%@",string); NSLog(@"%ld",[response statusCode]); [string release]; } ~~~ **7.同步--->POST请求** ~~~ - (void)onClickPostButton{ //@第一步,创建URL NSString * urlString = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx"; NSURL * url = [NSURL URLWithString:urlString]; //@第二步,创建请求 NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0]; // 设置请求方式POST,默认为GET [request setHTTPMethod:@"POST"]; // 设置参数 NSString * parameterString = @"date=20131129&startRecord=2&len=20&udid=1234567890&terminalType=Iphone&cid=213"; NSData * postData = [parameterString dataUsingEncoding:NSUTF8StringEncoding]; // 客户端向服务器提交数据,都是NSData类型,放在请求体里面 [request setHTTPBody:postData]; //@第三步,连接服务器 NSURLResponse * response = nil; NSData * data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil]; // NSData转化NSString 用的是实例方法 NSString * string = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]; } ~~~ **8.异步(代理方法,可以监测过程)--->POST请求(这里只展示POST请求,GET请求类似)** ~~~ - (void)onClickPostButton{ //@第一步,创建URL NSString * urlString = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx"; NSURL * url = [NSURL URLWithString:urlString]; //@第二步,创建请求 NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0]; // 设置请求方式POST,默认为GET [request setHTTPMethod:@"POST"]; // 设置参数 NSString * parameterString = @"date=20131129&startRecord=2&len=20&udid=1234567890&terminalType=Iphone&cid=213"; NSData * postData = [parameterString dataUsingEncoding:NSUTF8StringEncoding]; // 客户端向服务器提交数据,都是NSData类型,放在请求体里面 [request setHTTPBody:postData]; //@第三步,连接服务器(异步,同步太坑爹) // 实现2个协议 [NSURLConnection connectionWithRequest:request delegate:self]; } // 服务器开始给客户端回传数据,这个方法只会执行一次 - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{ // 服务器开始回传数据,客户端需要创建一个空的,可变的Data对象,用于存储每次获取的数据片段 // @property (nonatomic,retain)NSMutableData * returnInfoData; self.returnInfoData = [[NSMutableData alloc]init]; NSHTTPURLResponse * httpResponse = (NSHTTPURLResponse *)response; // 状态码 NSLog(@"%ld",httpResponse.statusCode); // 响应报头 NSLog(@"%@",httpResponse.allHeaderFields); NSLOG_FUNCTION; } // 客户端持续接收数据,data是数据片段,整个数据分段返回,这个方法执行的次数取决于数据总长度[response expectedContentLength] - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{ [_returnInfoData appendData:data]; NSLOG_FUNCTION; } // 数据完全下载成功,接收到完整数据 - (void)connectionDidFinishLoading:(NSURLConnection *)connection{ // _returnInfoData 是完整的数据了 [_returnInfoData release]; NSLOG_FUNCTION; } // 数据下载失败 - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{ NSLog(@"didFailWithError"); NSLOG_FUNCTION; } ~~~ **9.异步(Blcok方法,不能监测过程)--->POST请求(这里只展示POST请求,GET请求类似)** ~~~ - (void)onClickAsyncBlockButton{ //@第一步,创建URL NSString * urlString = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx"; NSURL * url = [NSURL URLWithString:urlString]; //@第二步,创建请求 NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0]; // 设置请求方式POST,默认为GET [request setHTTPMethod:@"POST"]; // 设置参数 NSString * parameterString = @"date=20131129&startRecord=2&len=20&udid=1234567890&terminalType=Iphone&cid=213"; NSData * postData = [parameterString dataUsingEncoding:NSUTF8StringEncoding]; // 客户端向服务器提交数据,都是NSData类型,放在请求体里面 [request setHTTPBody:postData]; //@第三步,连接服务器(异步,同步太坑爹) // sendAsynchronousRequest 异步接受数据 [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { // 数据已经接收完成,进行设置 }]; } ~~~
';