ASIHTTPRequest, AFNetworking, MKNetworkingKit网络框架get和post请求

ASIHTTPRequest, AFNetworking, MKNetworkingKit网络框架get和post请求

目录

一. 用第三方库实现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请求, 实现数据的缓存, 实现断点续传功能
  2. 由于ASI不支持ARC, 并且ASI库的作者已经不再维护这个工程, 所有支持ARC的功能没有实现, 一般新的项目不推荐使用
  3. ASIHttpRequest: ASI最主要的一个类, 这个类是继承于NSOperation

AFNetworking

  1. AFNetworking是iOS6之后的网络请求库, 能够实现get/post请求, 可以实现断点续传等功能
  2. AFNetworking使用简单, 支持ARC, 一般新的工程都会使用其进行
1. ASI实现get请求的使用步骤
  1. 导入ASI第三方库
  2. 设置为-fno-objc-arc
  3. 添加系统库文件
    1. SystemConfiguration,
    2. CFNetwork,
    3. MobileCoreServices
    4. libz.1.1.3.dylib
  4. 导入头文件使用
    1. 创建ASIHttpRequest对象  
    2. 设置代理, 遵守协议  
    3. 发送请求(异步请求)
  1. 代码
        ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:@"http://api.chengmi.com/shindex?passdate=20150108&curlng=121.5093155189223&curlat=31.27483773025054"]];
        request. delegate = self;
        [request startAsynchronous];
  2. 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];  
    
     …………………………………………………………………………………………
     }
  3. 常规流程: 创建数据源和表格视图, 实现表格视图代理方法

2. AFNetworking
  1. 导入AFNetworking库文件
  2. 导入头文件使用
    1. 创建”AFHTTPRequestOperationManager”类型的对象
    2. 设置返回值的解析方式(二进制)
      manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    3. 发送请求
      第一个参数: 请求的url字符串
      第二个参数: 附加的参数(传nil)
      第三个参数: 请求成功返回时调用的代码块(block)
      第四个参数: 请求失败时调用的代码块
  3. 注意的两点
    1. block代码块的执行是异步的
    2. block里面的变量通常会拷贝, 所以里面使用self指向的视图控制器对象时, 通常使用弱引用, 否则会有内存泄露
  1. 用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);
         }];
     }
  2. 常规流程: 创建数据源和表格视图, 调用下载数据方法, 实现表格视图代理方法

二. Post请求的实现

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

1. 使用系统的NSURLConnection完成Post请求
  1. 创建NSURL类型对象
  2. 创建NSMutableURLRequest类型对象, 设置对象的属性
    1. 设置请求体
    2. 设置请求方式
    3. 设置请求参数的大小
  3. 发送请求
  1. 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];
     }
  2. 创建数据源和表格视图, 实现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. 创建数据源和表格视图, 实现表格视图代理方法
LEAVE A REPLY
总访问数 158
loading