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

丶伊眸冷

静水流深,沧笙踏歌;三生阴晴圆缺,一朝悲欢离合。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

我不是机器人*