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) {
// 数据已经接收完成,进行设置
}];
}
~~~
';