D27:第三方库ASI, AFNetworking, MKNetworkingKit

目录

一. 用第三方库实现get请求

1. ASI
2. AFNetworking

二. Post请求的实现

1. NSURLConnection
2. ASI
3. AFNetworking

三. 使用MKNetworkingKit实现get和Post

1. get请求
2. Post请求

一. 用第三方库实现get请求

ASI

  1. ASI是较老的第三方库, 功能非常强大, 可以实现get/post请求, 实现数据的缓存, 实现断点续传功能
  1. 由于ASI不支持ARC, 并且ASI库的作者已经不再维护这个工程, 所有支持ARC的功能没有实现, 一般新的项目不推荐使用
  2. ASIHttpRequest: ASI最主要的一个类, 这个类是继承于NSOperation

AFNetworking

  1. AFNetworking是iOS6之后的网络请求库, 能够实现get/post请求, 可以实现断点续传等功能
  2. AFNetworking使用简单, 支持ARC, 一般新的工程都会使用其进行
1. ASI实现get请求的使用步骤
  1. 导入ASI第三方库
  1. 设置为-fno-objc-arc

  2. 添加系统库文件

    1. SystemConfiguration,
    2. CFNetwork,
    3. MobileCoreServices
    4. libz.1.1.3.dylib
  3. 导入头文件使用

    1. 创建ASIHttpRequest对象
    2. 设置代理, 遵守协议
    3. 发送请求(异步请求)
  4. 代码

     ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:@"http://api.chengmi.com/shindex?passdate=20150108&curlng=121.5093155189223&curlat=31.27483773025054"]];
     request. delegate = self;
     [request startAsynchronous];
    
  5. ASIHttpRequest代理方法

     // 下载失败时调用
     - (void)requestFailed:(ASIHTTPRequest *)request
     {
         NSLog(@"%s", __func__);
     }
     
     // 下载结束后调用
     - (void)requestFinished:(ASIHTTPRequest *)request
     {  
         // request.responseData存储下载回来的二进制数据
    
         // JSON解析
         id result = [NSJSONSerialization JSONObjectWithData:request.responseData options:NSJSONReadingMutableContainers error:nil];  
    
     …………………………………………………………………………………………
     }
    
  6. 常规流程: 创建数据源和表格视图, 实现表格视图代理方法


2. AFNetworking
  1. 导入AFNetworking库文件
  1. 导入头文件使用

    1. 创建"AFHTTPRequestOperationManager"类型的对象
    2. 设置返回值的解析方式(二进制)
      manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    3. 发送请求
      第一个参数: 请求的url字符串
      第二个参数: 附加的参数(传nil)
      第三个参数: 请求成功返回时调用的代码块(block)
      第四个参数: 请求失败时调用的代码块
  2. 注意的两点

  3. block代码块的执行是异步的

  4. block里面的变量通常会拷贝, 所以里面使用self指向的视图控制器对象时, 通常使用弱引用, 否则会有内存泄露

  5. 用AFNetworking实现get请求
    - (void)downloadData
    {
    // 1. 导入AFNetworking库文件
    // 2. 导入头文件使用
    // 1) 创建"AFHTTPRequestOperationManager"类型的对象
    AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] init];

         // 2) 设置返回值的解析方式(二进制)
         manager.responseSerializer = [AFHTTPResponseSerializer serializer];
         
         // 3) 发送请求
         /*
          第一个参数: 请求的url字符串
          第二个参数: 附加的参数(传nil)
          第三个参数: 请求成功返回时调用的代码块(block)
          第四个参数: 请求失败时调用的代码块
          */
          
         // 4) 注意的两点
         // 1. block代码块的执行是异步的
         // 2. block里面的变量通常会拷贝, 所以里面使用self指向的视图控制器对象时, 通常使用弱引用, 否则会有内存泄露
    
          __weak ViewController *weakSelf = self;
         [manager GET:@"http://api.chengmi.com/shindex?passdate=20150108&curlng=121.5093155189223&curlat=31.27483773025054" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
             
             // responseObject 存储了下载回来的数据
             // JSON解析
             id result = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];
             if ([result isKindOfClass:[NSDictionary class]]) {
                 NSDictionary *dict = result;
                 for (NSDictionary *sectionDict in dict[@"sectioninfo"]) {
                     DataModel *model = [[DataModel alloc] init];
                     [model setValuesForKeysWithDictionary:sectionDict];
                     [weakSelf.dataArray addObject:model];
                 }
                 [weakSelf.tableView reloadData];
             }
             
         } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
             NSLog(@"error:%@", error);
         }];
     }
    
  6. 常规流程: 创建数据源和表格视图, 调用下载数据方法, 实现表格视图代理方法


二. Post请求的实现

post请求: 参数不放在url字符串里面, 而是放在请求体里面, 安全性比较高, 而且传递的参数数据量会比较大
post请求不能直接在浏览器访问

1. 使用系统的NSURLConnection完成Post请求
  1. 创建NSURL类型对象
  1. 创建NSMutableURLRequest类型对象, 设置对象的属性

    1. 设置请求体
    2. 设置请求方式
    3. 设置请求参数的大小
  2. 发送请求

  3. downloadData方法
    - (void)downloadData
    {
    // 1. 创建NSURL类型对象
    NSURL *url = [NSURL URLWithString:@"http://services.xingshulin.com/ApricotForestWirelessServiceForLiterature/LiteratureDataServlet"];
    // 2. 创建NSMutableURLRequest类型对象
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
    NSString *param = @"sessionKey=7B63373363386530373034366164393262633633373039326138356238366366307D2C7B336464363563386338626263653130663531623832616632343963363832323065363964656161627D2C7B66616C73657D2C7B307D2C7B307D2C7B66373539333863642D326162352D346232342D616336622D3132386538626434663366397D2C7B37363033396665333533326461623034656561353162363734643131636532617D2C7B323031352D30332D30372031313A31383A33337D2C7B312E382E367D2C7B696F736C6974657261747572657D2C7B494F536C6974657261747572655F312E382E365F696F73382E312E335F6950686F6E65352D327D&pageSize=10&rtype=2&pageIndex=0&m=getLiteraturegroupBySpecialty";
    // 转化为二进制数据
    NSData *paramData = [param dataUsingEncoding:NSUTF8StringEncoding];

         // 1) 设置请求体
         [request setHTTPBody:paramData];
         
         // 2) 设置请求方式
         [request setHTTPMethod:@"post"];
         
         // 3) 设置请求参数的大小
         NSString *lengthStr = [NSString stringWithFormat:@"%ld", paramData.length];
         [request setValue:lengthStr forHTTPHeaderField:@"content-length"];
         
         // 4) 设置类型
         [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"content-type"];
     
         // 3.发送请求
         _connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
     }  
    
  4. 创建数据源和表格视图, 实现NSURLConnection代理方法和表格视图代理方法


2. 使用第三方库ASI完成Post请求
  1. 使用ASI进行Post请求
    - (void)downloadData
    {
    // 1. 导入ASI第三方库
    // 2. 添加编译属性-fno-objc-arc
    // 3. 添加系统库
    // 4. 导入头文件
    // 1)
    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:@"http://services.xingshulin.com/ApricotForestWirelessServiceForLiterature/LiteratureDataServlet"]];
    // 2) 设置代理
    request.delegate = self;
    // 3) 请求方式
    request.requestMethod = @"POST";
    // 4)
    [request setPostValue:@"7B63373363386530373034366164393262633633373039326138356238366366307D2C7B336464363563386338626263653130663531623832616632343963363832323065363964656161627D2C7B66616C73657D2C7B307D2C7B307D2C7B66373539333863642D326162352D346232342D616336622D3132386538626434663366397D2C7B37363033396665333533326461623034656561353162363734643131636532617D2C7B323031352D30332D30372031313A31383A33337D2C7B312E382E367D2C7B696F736C6974657261747572657D2C7B494F536C6974657261747572655F312E382E365F696F73382E312E335F6950686F6E65352D327D" forKey:@"sessionKey"];
    [request setPostValue:@"10" forKey:@"pageSize"];
    [request setPostValue:@"2" forKey:@"rtype"];
    [request setPostValue:@"0" forKey:@"pageIndex"];
    [request setPostValue:@"getLiteraturegroupBySpecialty" forKey:@"m"];
    // 5) 发送请求(异步请求)
    [request startAsynchronous];
    }

  2. 创建数据源和表格视图, 实现ASIHttpRequest代理方法和表格视图代理方法

  3. ASI可以上传文件或图片(代码写在发送请求之前)

     // 上传文件
     // 第一个参数: 文件的路径
     // 第二个参数: key值
     // request setFile:<#(NSString *)#> forKey:<#(NSString *)#>
     
     // 上传图片
     // 第一个参数: 文件的路径
     // 第二个参数: 文件的名字
     // 第三个参数: 文件的类型(image/png)
     // 第四个参数: key
     // request setFile:<#(NSString *)#> withFileName:<#(NSString *)#> andContentType:<#(NSString *)#> forKey:<#(NSString *)#>
    

3. 使用AFNetworking完成Post请求
  1. AFNetworking进行Post请求

     - (void)downloadData
     {
         // 1. 导入AFnetworking库文件
         // 2. 导入头文件使用
         
         // 1) 创建AFHTTPRequestOperationManager
         AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] init];
         
         // 2) 设置返回值为二进制类型
         manager.responseSerializer = [AFHTTPResponseSerializer serializer];
         
         // 3) 请求数据
         /*
          第一个参数: url地址
          第二个参数: Post请求的参数, 放在一个字典中
          第三个参数: 请求成功返回调用的代码块
          第四个参数: 请求失败调用的代码块
          */
         
         // 请求参数放到一个字典里面
         NSMutableDictionary *parameterDict = [NSMutableDictionary dictionary];
         [parameterDict setObject:@"7B63373363386530373034366164393262633633373039326138356238366366307D2C7B336464363563386338626263653130663531623832616632343963363832323065363964656161627D2C7B66616C73657D2C7B307D2C7B307D2C7B66373539333863642D326162352D346232342D616336622D3132386538626434663366397D2C7B37363033396665333533326461623034656561353162363734643131636532617D2C7B323031352D30332D30372031313A31383A33337D2C7B312E382E367D2C7B696F736C6974657261747572657D2C7B494F536C6974657261747572655F312E382E365F696F73382E312E335F6950686F6E65352D327D" forKey:@"sessionKey"];
         [parameterDict setObject:@"10" forKey:@"pageSize"];
         [parameterDict setObject:@"2" forKey:@"rtype"];
         [parameterDict setObject:@"0" forKey:@"pageIndex"];
         [parameterDict setObject:@"getLiteraturegroupBySpecialty" forKey:@"m"];
         
         // 4) 注意的两点
         // 1. block代码块的执行是异步的
         // 2. block里面的变量通常会拷贝, 所以里面使用self指向的视图控制器对象时, 通常使用弱引用, 否则会有内存泄露
         __weak ViewController *weakSelf = self;
         [manager POST:@"http://services.xingshulin.com/ApricotForestWirelessServiceForLiterature/LiteratureDataServlet" parameters:parameterDict success:^(AFHTTPRequestOperation *operation, id responseObject) {
             
             // JSON数据
             id result = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];
             
             if ([result isKindOfClass:[NSDictionary class]]) {
                 NSDictionary *dict = result;
                 NSLog(@"%@", dict);
                 
                 for (NSDictionary *objDict in dict[@"obj"]) {
                     DataModel *model = [[DataModel alloc] init];
                     [model setValuesForKeysWithDictionary:objDict];
                     [weakSelf.dataArray addObject:model];
                 }
                 [weakSelf.tableView reloadData];
             }
     
         } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
             
             NSLog(@"error:%@", error);
             
         }];
     }
    
  2. 创建数据源和表格视图, 实现表格视图代理方法

  3. AFNetworking可以上传文件或图片

     manager POST:(NSString *) parameters:(id) constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
         
         // 上传文件的时候会使用
         // formData appendPartWithFileURL:<#(NSURL *)#> name:<#(NSString *)#> error:<#(NSError *__autoreleasing *)#>
         
         // 上传图片
         // 第四个参数:@"image/png"
         // formData appendPartWithFileData:<#(NSData *)#> name:<#(NSString *)#> fileName:<#(NSString *)#> mimeType:<#(NSString *)#>
         
     } success:<#^(AFHTTPRequestOperation *operation, id responseObject)success#> failure:<#^(AFHTTPRequestOperation *operation, NSError *error)failure#>
    

三. 使用MKNetworkingKit实现get和Post

1. get请求
  1. 下载数据方法
    - (void)downloadData
    {
    // 1. MKNetworkKit文件夹拖入项目,然后引入4个framework:
    // CFNetwork.framework , SystemConfiguration.framework , Security.framework, ImageIO.framework

         // 2. 注意主机名HostName不能加"http://", 程序会自动添加, 主机要指向一个目录, 不可以是一个具体文件, 如上类不可以是"www.***.net/json/conn.asp"
         
         MKNetworkEngine *engine = [[MKNetworkEngine alloc] initWithHostName:@"iappfree.candou.com:8080" customHeaderFields:nil];
         MKNetworkOperation *operation = [engine operationWithPath:@"/free/applications/limited?currency=rmb&page=1" params:nil httpMethod:@"GET" ssl:NO];
         
         [operation addCompletionHandler:^(MKNetworkOperation *operation) {
             
             id result = [NSJSONSerialization JSONObjectWithData:operation.responseData options:NSJSONReadingMutableContainers error:nil];
             if ([result isKindOfClass:[NSDictionary class]]) {
                 NSDictionary *dict = result;
                 for (NSDictionary *appDict in dict[@"applications"]) {
                     DataModel *model = [[DataModel alloc] init];
                     [model setValuesForKeysWithDictionary:appDict];
                     [self.dataArray addObject:model];
                 }
                 [self.tableView reloadData];
             }
             
         } errorHandler:^(MKNetworkOperation *errorOp, NSError* err) {
             NSLog(@"MKNetwork request error : %@", [err localizedDescription]);
         }];
         
         [engine enqueueOperation:operation];
     }  
    
  2. 创建数据源和表格视图, 实现表格视图代理方法


2. Post请求
  1. 下载数据方法
    - (void)downloadData
    {
    // 1. MKNetworkKit文件夹拖入项目,然后引入4个framework:
    // CFNetwork.Framework , SystemConfiguration.framework , Security.framework

         // 2. 注意主机名HostName不能加"http://", 程序会自动添加, 主机要指向一个目录, 不可以是一个具体文件, 如上类不可以是"www.***.net/json/conn.asp"
         
         MKNetworkEngine *engine = [[MKNetworkEngine alloc] initWithHostName:@"services.xingshulin.com/ApricotForestWirelessServiceForLiterature/LiteratureDataServlet" customHeaderFields:nil];
         
         NSMutableDictionary *paramsDict = [NSMutableDictionary dictionary];
         [paramsDict setObject:@"7B63373363386530373034366164393262633633373039326138356238366366307D2C7B336464363563386338626263653130663531623832616632343963363832323065363964656161627D2C7B66616C73657D2C7B307D2C7B307D2C7B66373539333863642D326162352D346232342D616336622D3132386538626434663366397D2C7B37363033396665333533326461623034656561353162363734643131636532617D2C7B323031352D30332D30372031313A31383A33337D2C7B312E382E367D2C7B696F736C6974657261747572657D2C7B494F536C6974657261747572655F312E382E365F696F73382E312E335F6950686F6E65352D327D" forKey:@"sessionKey"];
         [paramsDict setObject:@"10" forKey:@"pageSize"];
         [paramsDict setObject:@"2" forKey:@"rtype"];
         [paramsDict setObject:@"0" forKey:@"pageIndex"];
         [paramsDict setObject:@"getLiteraturegroupBySpecialty" forKey:@"m"];
         
         MKNetworkOperation *operation = [engine operationWithPath:nil params:paramsDict httpMethod:@"POST"];
         
         [operation addCompletionHandler:^(MKNetworkOperation *operation) {
             
             id result = [NSJSONSerialization JSONObjectWithData:operation.responseData options:NSJSONReadingMutableContainers error:nil];
             
             if ([result isKindOfClass:[NSDictionary class]]) {
                 NSDictionary *dict = result;
                 NSLog(@"%@", dict);
                 
                 for (NSDictionary *objDict in dict[@"obj"]) {
                     DataModel *model = [[DataModel alloc] init];
                     [model setValuesForKeysWithDictionary:objDict];
                     [_dataArray addObject:model];
                 }
                 [_tableView reloadData];
             }
             
         } errorHandler:^(MKNetworkOperation *errorOp, NSError* err) {
             NSLog(@"MKNetwork request error : %@", [err localizedDescription]);
         }];
         
         [engine enqueueOperation:operation];
     }
    
  2. 创建数据源和表格视图, 实现表格视图代理方法

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

推荐阅读更多精彩内容