iOS网络编程(一)NSURLConnection

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

}
文章导航