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 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. 创建数据源和表格视图, 实现表格视图代理方法

你可能感兴趣的:(D27:第三方库ASI, AFNetworking, MKNetworkingKit)