iOS:NSURLConnection使用

一、GET请求方式:

/*
get请求网络api
 */
- (void)doGet{
    //url
    NSString *urlStr = [NSString stringWithFormat:@"https://m.baidu.com/s?word=%@", @"phone"];
    //对URL字符串进行转义,处理空格中文等情况
    urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    //还原转义的url字符串
    //urlStr = [urlStr stringByRemovingPercentEncoding];
    NSLog(@"url: %@", urlStr);
    //1.创建url
    NSURL *url = [NSURL URLWithString:urlStr];
    //2.创建request
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    //3.执行异步请求,NSOperationQueue alloc]表示多线程,在子线程中请求
    [NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
        
        //请求失败时返回
        if(connectionError != nil){
            NSLog(@"请求失败");
            return;
        }
        
        //4.将网络返回的data转为String字符串
        NSString *json = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        //5.解析返回的字符串
        NSLog(@"result: %@", json);
        //6.用主线程更新界面
        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
            //此处在主线程,可以设置界面数据
        }];
    }];
}

二、POST请求方式(请求body可以为key=value或json):

/*
 post请求网络api(请求body为:key=value方式、json方式)
 */
- (void)doPost{
    //url
    NSString *urlStr = [NSString stringWithFormat:@"https://m.baidu.com/"];
    NSLog(@"url: %@", urlStr);
    //1.创建url
    NSURL *url = [NSURL URLWithString:urlStr];
    //2.创建request
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    //请求方式设为POST,默认为GET
    request.HTTPMethod = @"POST";
    //3.添加请求数据
    //(1)key=value方式(key1=value1&key2=value2):
//    NSString *bodyStr = [NSString stringWithFormat:@"word=%@", @"phone"]; //生成key=value的String字符串
//    request.HTTPBody = [bodyStr dataUsingEncoding:NSUTF8StringEncoding]; //将NSString字符串转为NSData并赋值
    //(2)json方式:
    NSString *bodyJson = @"{word: phone}"; //json的NSString字符串
    request.HTTPBody = [bodyJson dataUsingEncoding:NSUTF8StringEncoding]; //将NSString字符串转为NSData并赋值
    
    //4.执行异步请求,NSOperationQueue alloc]表示多线程,在子线程中请求
    [NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
        
        //请求失败时返回
        if(connectionError != nil){
            NSLog(@"请求失败");
            return;
        }
        
        //4.将网络返回的data转为String字符串
        NSString *json = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        //5.解析返回的json
        NSLog(@"result: %@", json);
        //6.用主线程更新界面
        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
            //此处在主线程,可以设置界面数据
        }];
    }];
}

三、请求获取服务器返回流(下载文件可使用这种方式):

1.定义用于接收服务器返回流的NSMutableData变量,并实现NSURLConnectionDataDelegate:

@interface ViewController () <NSURLConnectionDataDelegate>

//服务器接收的数据
@property (nonatomic, strong) NSMutableData *data;

@end

2.执行请求,并监听接收的几个方法:
/*
 请求网络获取流数据,如文件下载
 */
- (void)doGetStream{
    //url
//    NSString *urlStr = @"http://dldir1.qq.com/qqfile/QQforMac/QQ_V6.5.2.dmg";
    NSString *urlStr = @"https://m.baidu.com/";
    NSLog(@"url: %@", urlStr);
    //1.创建url
    NSURL *url = [NSURL URLWithString:urlStr];
    //2.创建request
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    //3.创建NSURLConnection
    NSURLConnection *conn = [NSURLConnection connectionWithRequest:request delegate:self];
    //4.开始连接(子线程执行)
    dispatch_async(dispatch_queue_create("stream", DISPATCH_QUEUE_CONCURRENT), ^{
        [conn start];
    });
}
/*
 收到服务端响应,准备工作
 */
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
    if(!self.data){
        //为空时初始化
        self.data = [NSMutableData data];
    } else {
        //首次设置为nil
        [self.data setData:nil];
    }
}
/*
 接收流数据
 */
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
    NSLog(@"didReceiveData: %@", [NSThread currentThread]);
    [self.data appendData:data];
}
/*
 接收完成
 */
- (void)connectionDidFinishLoading:(NSURLConnection *)connection{
    //将网络返回的data转为String字符串
    NSString *result = [[NSString alloc] initWithData:self.data encoding:NSUTF8StringEncoding];
    NSLog(@"result: %@", result);
}
/*
 接收出错时触发
 */
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
    NSLog(@"接收出错: %@", error.localizedDescription);
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值