网络数据请求(同步/异步连接下的GET/POST请求)

一.同步连接下的GET请求:

//第一步:创建网址对象
    NSURL * url = [NSURL URLWithString:@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?date=20131129&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213"];
    //第二步:创建网络请求对象
    NSURLRequest * request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60.0];
    //第三步:创建连接对象,发送请求
    NSURLResponse * response = nil;
    NSError * error = nil;
    //返回的是NSData类型的数据
    NSData * data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
    //解析JSON数据第一种方式
    NSMutableDictionary * dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
    NSLog(@"%@",dic);
    NSLog(@"123");
    NSString * string = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
    
    //解析JSON数据第二种方式:(使用第三方JSONKit)
    NSDictionary *dic = [data objectFromJSONData];
    //将字典转换成NSString形式
    NSString * string = [dic JSONString];
    NSLog(@"%@",string);
    self.dataTextView.text = string;

二.异步连接下的GET请求:(异步连接,必须通过协议方式处理请求过来的数据,所以需要遵守两个协议:<NSURLConnectionDelegate,NSURLConnectionDataDelegate>)

//第一步:创建网址对象
    NSURL * url = [NSURL URLWithString:BaseUrl];
    //第二步:创建网络请求对象
    NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60.0];
    //第三步:创建异步连接,并发送请求
    self.connection =[NSURLConnection connectionWithRequest:request delegate:self];//声明个属性,因为下面的协议方法中需要取消连接(手动)

实现代理方法:

//1.将要发送请求
-(NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)response
{
    NSLog(@"request = %@",request);
    return request;
}
//2.服务器已经响应
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    //获取文件总长度
    _value = response.expectedContentLength;
    //给_recieveData开辟空间
    _recieveData = [[NSMutableData alloc]init];
    
    NSLog(@"response = %@",response);
}
//3.已经开始接收数据
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    //进行拼接
    [_recieveData appendData:data];//必须是可变的data
    NSLog(@"%ld",[_recieveData length]);//输出拼接后长度
    //将每次拼接得到的数据除以总数据的大小
    self.progressVIew.progress = 1.0*[_recieveData length]/_value;//注意需要乘以1.0
    
    NSLog(@"data = %@",data);
}
//4.数据传输(发送/接收)结束
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    NSLog(@"*******%@",connection);
    [connection cancel];
}
//5.传输数据失败
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    NSLog(@"失败原因:%@",error);
}

三.同步下的POST请求:(使用了第三方JSONKit)

//1.创建网址对象
    NSURL *url = [NSURL URLWithString:BASE_URL_2];
    //2.创建请求对象(创建可变的,因为后面要设置request中的属性值)
    NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60.0];
    //3.设置请求方式(如果没设置,默认是GET请求)
    [request setHTTPMethod:@"POST"];
    
#warning mark------NSString与NSData类型之间的转换非常非常重要,必须要掌握
    
#pragma mark-----NSString转换为NSData
    NSData * data = [BASE_URL_2_PARAM dataUsingEncoding:NSUTF8StringEncoding];
#pragma mark-----NSData转换成NSString
//    NSString *string = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
    
    //4.设置请求体
    [request setHTTPBody:data];
    //5.创建连接对象,并发送请求
    NSData * data1 = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
    //解析数据
    NSMutableDictionary * dic = [NSJSONSerialization JSONObjectWithData:data1 options:NSJSONReadingMutableContainers error:nil];
    
    NSString * string = [dic JSONString];
    self.dataTextView.text = string;

四.异步连接下的POST请求:(同样需要遵守上面提到的两个协议:<NSURLConnectionDelegate,NSURLConnectionDataDelegate>)

//1.创建网址对象
    NSURL *url = [NSURL URLWithString:BASE_URL_2];
    //2.请求对象
    NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:60.0];
    //①.设置请求方式
    [request setHTTPMethod:@"POST"];
    //②.设置请求体
    NSData *data = [BASE_URL_2_PARAM dataUsingEncoding:NSUTF8StringEncoding];
    [request setHTTPBody:data];
    //3.创建异步连接对象,并发送请求
#pragma mark ------第一种方式:(通过协议的方式,处理请求数据)
//    [NSURLConnection connectionWithRequest:request delegate:self];
#pragma mark ------第二种方式:(block方式)
    //调取系统队列
    NSOperationQueue * mainQueue = [NSOperationQueue mainQueue];
    //防止内存泄露
    __block SecondViewController *secondVC = self;
    [NSURLConnection sendAsynchronousRequest:request queue:mainQueue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
        //此方法中data是获得的最后的data,相对于协议方法,协议可以获得每一步中的data
        NSMutableDictionary *dic = [data objectFromJSONData];
        secondVC.dataTextView.text = [dic JSONString];
    }];

实现协议方法:

//1.将要发送请求
-(NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)response
{
    return request;
}
//2.服务器已经响应
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    
    //开辟空间
    _recieveData = [[NSMutableData alloc]init];
}
//3.已经开始接收数据
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    //对每次传来的数据进行拼接
    [_recieveData appendData:data];
    
    
}
//4.接收数据完毕
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    //解析最后拼接完成的完整数据
    NSMutableDictionary * dic = [_recieveData objectFromJSONData];
    self.dataTextView.text = [dic JSONString];
}
//5.传输过程中出现错误:(断网,自动关机,断电....),发生错误时执行
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    NSLog(@"error = %@",error);
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值