现在的位置: 首页 > 综合 > 正文

IOS网络编程笔记(2)

2018年03月20日 ⁄ 综合 ⁄ 共 4479字 ⁄ 字号 评论关闭

这篇文章主要讲述苹果提供的NSURLConnectione和NSURLRequest网络请求API来请求网络数据的基本用法。

 一、网络请求的步骤

  1.构造地址NSURL

  2.构造请求NSURLRequest

  3.构造启动连接NSURLConnection

  4.发送同步请求\异步请求

  5.代理对象实现协议,用于监听通讯事件

     NSURLConnection 通讯协议

     1.NSURLConnectionDelegate

     2.NSURLConnectionDataDelegate

        NSURLConnectionDownloadDelegate 子协议

我们根据同步请求\异步请求来分别讲述介绍他们的基本用法

二、同步请求

    //1.构造地址NSURL
    NSURL *url = [NSURL URLWithString:@"http://piao.163.com/m/cinema/list.html?app_id=1&mobileType=iPhone&ver=2.6&channel=appstore&deviceId=9E89CB6D-A62F-438C-8010-19278D46A8A6&apiVer=6&city=110000"];
    
    //2.构造请求NSURLRequest
//    NSURLRequest  : 不可变请求对象,不能动态添加请求信息
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
        //2.1> 请求方式
    [request setHTTPMethod:@"GET"];
        //2。2> 超时时间
    [request setTimeoutInterval:60];
        //2.3> 设置请求头信息
//    [request setAllHTTPHeaderFields:<#(NSDictionary *)#>]
//    [request setValue:<#(NSString *)#> forHTTPHeaderField:<#(NSString *)#>];
//    [request addValue:<#(NSString *)#> forHTTPHeaderField:<#(NSString *)#>];
        //2.4> 设置请求体
//    [request setHTTPBody:<#(NSData *)#>];
    
        //2.5>设置请求头,告诉服务器数据需要压缩
    [request setValue:@"gzip" forHTTPHeaderField:@"Accept-Encoding"];
    
        //2.6> 设置缓存
    [request setCachePolicy:NSURLRequestReturnCacheDataElseLoad];
    
    //3.构造NSURLConnection
    NSHTTPURLResponse *response = nil;
    NSError *error;
    
    
    //4.发送同步请求
    //(NSError **)error 像这样的双指针参数,需要用&符号取得变量的地址传入
    NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
    
    //5.解析数据
        //5.1将data转成字符串
    NSString *jsonstring = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    NSLog(@"jsonstring = %@",jsonstring);
    
        //5.2解析JSON
    NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
    NSLog(@"数据结果:%@",dic);
    
    //6.取得响应的信息
    //取得状态码
    NSInteger statusCode = response.statusCode;
    //取得所有的响应头
    NSDictionary *headerFields = response.allHeaderFields;
    
    NSLog(@"statusCode = %d",statusCode);
    NSLog(@"headerFields = %@",headerFields);

三、异步请求

方式一:

    //1.构造URL
    NSURL *url = [NSURL URLWithString:@"http://piao.163.com/m/cinema/schedule.html?app_id=1&mobileType=iPhone&ver=2.6&channel=appstore&deviceId=9E89CB6D-A62F-438C-8010-19278D46A8A6&apiVer=6&city=110000"];
    
    //2.构造Request
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    [request setHTTPMethod:@"POST"];
    [request setTimeoutInterval:60];
    
    //3.添加请求体数据
    NSString *parasText = @"cinema_id=1533";
    NSData *data = [parasText dataUsingEncoding:NSUTF8StringEncoding];
    //设置请求体数据
    [request setHTTPBody:data];
    
    //4.构造NSURLConnection
    //connectionWithRequest : 创建NSURLConnection对象,同事发送异步请求
    [NSURLConnection connectionWithRequest:request delegate:self];
    
    /*
     NSURLConnection 通讯协议
     1.NSURLConnectionDelegate
     2.NSURLConnectionDataDelegate
       NSURLConnectionDownloadDelegate 子协议
    */

请求调用的协议方法

#pragma mark - NSURLConnection 协议方法
//1. 接受到服务器的响应
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    
    //取得响应对象
    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
    NSDictionary *fields = httpResponse.allHeaderFields;
    NSLog(@"%@",fields);
    
    self.receiveData = [[NSMutableData alloc] init];
}

//2.接受服务器传输的数据,数据量大时,会被调用多次,因为数据是分批传输的
//在此协议方法中可以监听数据传输的进度
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    
    //对每次传输的数据进行拼接
    [self.receiveData appendData:data];
    
    NSLog(@"接受了%d字节的数据",data.length);
}

//3.接受数据完成
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    
    NSString *jsonString = [[NSString alloc] initWithData:self.receiveData encoding:NSUTF8StringEncoding];
    _textView.text = jsonString;
    
    //解析JSON
}

//4.请求失败调用的协议方法
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
   
    NSLog(@"网络请求错误:%@",error);
    
}

方式二:

    //1.构造URL
    NSURL *url = [NSURL URLWithString:@"http://piao.163.com/m/cinema/schedule.html?app_id=1&mobileType=iPhone&ver=2.6&channel=appstore&deviceId=9E89CB6D-A62F-438C-8010-19278D46A8A6&apiVer=6&city=110000"];
    
    //2.构造Request
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    [request setHTTPMethod:@"POST"];
    [request setTimeoutInterval:60];
    
    //3.添加请求体数据
    NSString *parasText = @"cinema_id=1533";
    NSData *data = [parasText dataUsingEncoding:NSUTF8StringEncoding];
    //设置请求体数据
    [request setHTTPBody:data];
    
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    //使用如下方式发送异步请求,无法监听数据传输,也不能监听传输的进度
    /**
     *
     *  @param request
     *  @param queue  队列,请求线程会被添加到此队列中
     *  @param completionHandler  数据请求完成之后,调用此block, 这个block是多线程调用的
     *
     */
    [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
        
        //多线程调用
        
        NSString *jsonString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        
        //回到主线程刷新UI
        dispatch_sync(dispatch_get_main_queue(), ^{
//            _textView.text = jsonString;
            NSLog(@"jsonString = %@",jsonString);
        });
        
    }];

【上篇】
【下篇】

抱歉!评论已关闭.