2. NSURLConnection

NSURLConnection

一. iOS中发送HTTP请求的方案

  1. 苹果原生

    • NSURLConnection: 用法简单, 比较古老但是最直接的方案
    • NSURLSession: 功能比NSURLConnection强大, 苹果目前推荐使用的技术(2013年推出, iOS7开始的技术)
    • CFNetwork: NSURL类型框架的底层实现, 纯C语言
  2. 第三方框架

    • ASIHttpRequest: 外号HTTP终结者, 功能及其强大, 但是已经停止更新
    • AFNetworking: 简单易用, 提供了大部分常用的功能, 维护使用者多
    • MKNetworkKit: 简单易用, 印度阿三的产物, 使用者维护者较少
  3. 建议

    • 随着AFN框架的普遍性以及众多开发者合力维护, 建议尽量使用AFN框架
    • 并且, 为了提高开发效率, 建议直接使用三方框架

二. NSURLConnection发送GET请求

  1. 常用类的介绍

    • iOS中与网络相关的类, 都是以NSURL开头的类
    • NSURLRequest: 请求类, 每一个Request对象就代表一个请求, 其中包含的信息大致有:
      • NSURL对象, 代表请求的URL地址
      • 请求方法, 请求头, 请求体
      • 请求超时的信息(通过代理方法来监听)
      • 是否允许蜂窝移动网络发送请求等等....
    • NSMutableURLRequest: 他是NSURLRequest的子类, 可以在请求的同时包含更多的详细属性参数, 多用于POST请求
    • NSURLConnection: 负责处理网络交互的类
      • 负责发送请求, 建立客户端和服务器连接的类
      • 发送数据给服务器, 并收集来自服务器的响应数据
  2. NSURLConnection的使用步骤

    • 创建一个NSURL对象, 也就是设置请求路径
    • 使用NSURL对象来创建一个NSURLRequest对象, 并且设置请求头, 请求体
    • 使用NSURLConnection发送请求(发送请求的常见方式如下)
      • 同步请求: + (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error
      • 异步请求(不会卡住主线程): 根据对服务器返回数据的处理方式不同, 可分为两种
        • block回调: + (void)sendAsynchronousRequest:(NSURLRequest*) request queue:(NSOperationQueue*) queue completionHandler:(void (^)(NSURLResponse* response, NSData* data, NSError* connectionError)) handler
        • 代理监听请求结果: 注意遵守协议
          • 首先, 要在发送请求的同时设置代理: + (NSURLConnection*)connectionWithRequest:(NSURLRequest *)request delegate:(id)delegate
          • 之后, 如果使用的是代理方法, 那么就需要手动发出网络请求- (void)start
          • 最后, 可以通过各种代理方法来处理返回的数据
  3. GET请求的代码示例:

     // 同步请求
     - (void)sendSync {
         
         // 1. 请求路径
         NSURL *url = [NSURL URLWithString:@"http://192.168.1.101:88/login?username=MyiOS&pwd=999&type=JSON"];
         
         // 2. 创建请求对象
         // requeset内部会自动提供默认的请求头信息,默认是以GET方式发送的
         NSURLRequest *request = [NSURLRequest requestWithURL:url];
         
         // 3. 发送请求
         // 3.1 响应头,他和响应体都是以data数据返回的
         NSURLResponse *response = nil;
         
         // 3.2 发送请求获取数据
         NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];
         
         NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
         
         // 4. 打印响应头
         NSLog(@"%@", response);
         
         NSLog(@"%@", [NSThread currentThread]); // 在主线程解析数据
     }
     
     // 异步请求 - block回调
     - (void)sendAsync {
         
         // 1. 请求路径
         NSURL *url = [NSURL URLWithString:@"http://192.168.1.101:88/login?username=MyiOS&pwd=999&type=JSON"];
         
         // 2. 创建请求对象
         NSURLRequest *request = [NSURLRequest requestWithURL:url];
         
         // 3. 发送异步请求
         /*
          (NSURLRequest *)request  请求对象
          (NSOperationQueue *)queue  队列(决定代码在哪个线程中执行)
          completionHandler:(void (^)(NSURLResponse *response, NSData *data, NSError *connectionError))handler 连接完成后回调
             NSURLResponse *response  响应头信息
             NSData *data             返回的数据
             NSError *connectionError 如果请求失败,保存失败信息
          */
         [NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
             
             // 3.1 如果连接错误为nil,证明连接成功
             if (connectionError == nil) {
                 // 4. 解析返回的数据
                 NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
                 NSLog(@"%@", response);
                 NSLog(@"%@", [NSThread currentThread]); // 在子线程中解析数据
             }
         }];
         NSLog(@"%@", [NSThread currentThread]);
     }
     
     // 异步请求2 - 代理监听
     - (void)sendAsync2 {
         
         // 1. 创建请求路径
         NSURL *url = [NSURL URLWithString:@"http://192.168.1.101:88/login?username=MyiOS&pwd=999&type=JSON"];
         
         // 2. 创建请求对象
         NSURLRequest *request = [NSURLRequest requestWithURL:url];
         
         // 3. 设置代理,发送请求
         NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
         
         // 4. 开始发送网络请求
         [connection start];
     }
     
     #pragma mark - 代理方法,当发送了请求之后,会调用的方法
     // 1. 当接收到了响应的时候调用
     - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
         
         // 当接收到了响应,就创建data对象,准备接收数据
         self.data = [NSMutableData data];
         NSLog(@"%@", response);
     }
     
     // 2. 当接收到了数据的时候调用
     /*
      1> 该方法可能调用多次,当返回数据较大的时候,系统会一点一点接收数据
      2> 把每次接收的数据拼接起来,等接收完成,就是完整的数据了
      */
     - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
         
         // 查看当前数据的长度
         NSLog(@"%ld", data.length);
         
         // 拼接数据
         [self.data appendData:data];
     }
     
     // 3. 当请求失败的时候调用该方法
     - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
         
         NSLog(@"请求失败");
     }
     
     // 4. 当请求完成的时候调用,请求已经完成,接收数据完毕
     - (void)connectionDidFinishLoading:(NSURLConnection *)connection {
         
         // 解析数据
         NSLog(@"%@", [[NSString alloc] initWithData:self.data encoding:NSUTF8StringEncoding]);
         
         NSLog(@"数据接收完毕");
         NSLog(@"%@", [NSThread currentThread]);
     }
    

三. NSURLConnection发送POST请求

  1. NSMutableURLRequest

    • 普通的NSURLRequest默认发送的是GET请求, GET只能发送一些简单的请求, 用于获取数据
    • 而NSMutableURLRequest, 可以包含更多的请求信息, 如:
      • 修改请求方法: 默认的请求方式为GET
      • 设置最大请求时间: 当超过最大时间还没连接成功的话, 那么认为请求失败
      • 设置请求头信息: 比如设置客户端的信息(当前设备为iOS9.0)
      • 设置请求体: 请求体是将NSData的二进制数据, 发送给服务器, 通过这点就可以发送文件
    • 补充GET和POST的请求格式
  2. POST请求的简单实现代码

     - (void)post {
         
         // 1. 确定请求路径
         NSURL *url = [NSURL URLWithString:@"http://192.168.2.101:40/lgoin"];
         
         // 2. 创建可变请求对象
         NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
         
         // 3. 修改请求方法为POST(因为默认为GET)
         request.HTTPMethod = @"POST";
         
         // 4. 设置最大请求时间
         request.timeoutInterval = 15; // 如果请求时间超过15秒还没得到响应,那么认为请求失败
         
         // 5. 设置请求头信息(Key为User-Agent)
         [request setValue:@"iOS 9.0" forHTTPHeaderField:@"User-Agent"];
         
         // 6. 设置请求体(将参数发送给服务器)
         request.HTTPBody = [@"username=520it&pwd=520it&type=JSON" dataUsingEncoding:NSUTF8StringEncoding];
         
         // 7. 发送请求(异步)
         [NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
             
             // 接收数据并解析
             if (connectionError == nil) {
                 
                 NSLog(@"数据接收完毕,开始解析");
                 NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
             }
         }];
     }
    
  3. 补充:

    • 如果你的系统版本是适配iOS7.0以后的版本, 尽量使用NSURLSession
    • 同时, 在企业开发中, 尽量使用AFN等三方框架来处理你的网络请求, 提高开发效率
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,552评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,666评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,519评论 0 334
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,180评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,205评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,344评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,781评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,449评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,635评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,467评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,515评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,217评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,775评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,851评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,084评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,637评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,204评论 2 341

推荐阅读更多精彩内容

  • iOS开发系列--网络开发 概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微博、微信等,这些应用本身可...
    lichengjin阅读 3,633评论 2 7
  • 常用类 NSURL:请求地址 NSURLRequest:一个NSURLRequest对象就代表一个请求,它包含的信...
    JonesCxy阅读 957评论 0 1
  • 基本使用 通过NSURLConnection发送请求常用的类NSURL : 用于创建网络请求地址NSURLRequ...
    Mario_ZJ阅读 426评论 0 0
  • 网络基础 Http: 苹果原生: NSURLConnection 03年推出的古老技术 NSURLSession...
    木子尚武阅读 282评论 0 0
  • 平时在项目中一直是用网络请求的第三方框架 AFNetwork和 ASIHTTPRequest比较多一些。最近还是想...
    明若晴空阅读 2,037评论 0 1