iOS网络编程(一)NSURLConnection

来源:互联网 发布:发货找物流软件 编辑:程序博客网 时间:2024/05/17 11:06

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.NSURLRequestNSMutableURLRequest

@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个协议<NSURLConnectionDelegate,NSURLConnectionDataDelegate>    [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) {                // 数据已经接收完成,进行设置            }];}




0 0
原创粉丝点击