zoukankan      html  css  js  c++  java
  • iOS 网络操作与AFNetworking

    一、早前的几个网络框架
    1、ASI框架: HTTP终结者.很牛, 但是有BUG, 已经停止更新.
    2、MKNetworkKit (印度人写的).
    3、AFN一直还在更新.

    AFNetworking的出现:MAC/iOS设计的一套网络框架.(为了简化网络操作)

    *AFN专注与网络数据传输,以及网络中多线程的处理.

    二、AFNetworking的使用

    1、AFN特性 :
    *登录传参数时,传递字典即可.(键名为参数名,键值为参数值).
    *自动到子线程中执行,执行完后返回主线程.
    *返回的结果自动序列化为NSDictionary.
     
    2、使用AFN注意 :
    *AFHTTPRequestOperationManager封装了通过HTTP协议与Web应用程序进行通讯的常用方法.(这个实例化的时候不是单例, 因为没有shared字)
    *包括创建请求/响应序列化/网络监控/数据安全.
    *方法等都是以AF开头的.
    3、AFN能做的 (网络中的都涵盖了):
    *GET/POST/PUT/DELETE/HEAD请求.
    *JSON数据解析/Plist数据解析.(不支持XML数据解析)
    *POSTJSON.
    *上传/下载.
    4、使用步骤 : (可参考说明文档)
    1.首先需要实例化一个请求管理器AFHTTPRequestOperationManager.
    2.设置请求的数据格式:默认是二进制.(可改)
    *AFHTTPRequestSerializer(二进制)
    *AFJSONRequestSerializer(JSON)
    *AFPropertyListRequestSerializer(Plist)
    3.设置响应的数据格式:默认是JSON.(可改)
    *AFHTTPResponseSerializer(二进制)
    *AFJSONResponseSerializer(JSON)
    *AFPropertyListResponseSerializer(Plist)
    *AFXMLParserResponseSerializer(XML)
    *AFImageResponseSerializer(Image)
    *AFCompoundResponseSerializer(组合的)
    4.如果响应者的MIMEType不正确,就要修改acceptableContentTypes.
    5.调用方法,发送响应的请求(GET/POST...).

    关于修改AFN源码:通常序列化时做对text/plan等的支持时,可以一劳永逸的修改源代码,在acceptableContentTypes中修改即可。

    AFN进行GET、POST登录:

    [objc] view plaincopy
     
    1. #pragma mark - get/post登录  
    2. - (void)getLogin {  
    3.     //1.管理器  
    4.     AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];  
    5.   
    6.     //2.设置登录参数  
    7.     NSDictionary *dict = @{ @"username":@"xn", @"password":@"123" };  
    8.   
    9.     //3.请求  
    10.     [manager GET:@"http://localhost/login.php" parameters:dict success: ^(AFHTTPRequestOperation *operation, id responseObject) {  
    11.         NSLog(@"GET --> %@, %@", responseObject, [NSThread currentThread]); //自动返回主线程  
    12.     } failure: ^(AFHTTPRequestOperation *operation, NSError *error) {  
    13.         NSLog(@"%@", error);  
    14.     }];  
    15. }  
    16.   
    17. /** 
    18.  *  和上面的GET用法完全一样, 只有一个POST参数不一样 
    19.  */  
    20. - (void)postLogin {  
    21.     //1.管理器  
    22.     AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];  
    23.   
    24.     //2.设置登录参数  
    25.     NSDictionary *dict = @{ @"username":@"xn", @"password":@"123" };  
    26.   
    27.     //3.请求  
    28.     [manager POST:@"http://localhost/login.php" parameters:dict success: ^(AFHTTPRequestOperation *operation, id responseObject) {  
    29.         NSLog(@"POST --> %@, %@", responseObject, [NSThread currentThread]); //自动返回主线程  
    30.     } failure: ^(AFHTTPRequestOperation *operation, NSError *error) {  
    31.         NSLog(@"%@", error);  
    32.     }];  
    33. }  


    AFN进行网络数据解析,获取Plist,JSON,XMLAFN不支持自动解析XML,有专门的框架去做,如SAX,PULL,KissXML等)

    [objc] view plaincopy
     
    1. #pragma mark - get 数据解析  
    2. - (void)getJSON {  
    3.     //1.请求管理器  
    4.     AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];  
    5.   
    6.     //2.发起请求  
    7.     [manager GET:@"http://localhost/videos.json" parameters:nil success: ^(AFHTTPRequestOperation *operation, id responseObject) {  
    8.         NSLog(@"%@", responseObject);  
    9.     } failure: ^(AFHTTPRequestOperation *operation, NSError *error) {  
    10.         NSLog(@"%@", error);  
    11.     }];  
    12. }  
    13.   
    14. /** 
    15.  *  不支持XML数据解析 
    16.  */  
    17. - (void)getXML {  
    18.     //1.管理器  
    19.     AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];  
    20.   
    21.     //2.设置返回数据类型  
    22.     manager.responseSerializer = [AFXMLParserResponseSerializer serializer]; //先实例化一下  
    23.   
    24.     //3.发起请求  
    25.     [manager GET:@"http://localhost/videos.xml" parameters:nil success: ^(AFHTTPRequestOperation *operation, id responseObject) {  
    26.         NSLog(@"%@", responseObject);  
    27.     } failure: ^(AFHTTPRequestOperation *operation, NSError *error) {  
    28.         NSLog(@"%@", error);  
    29.     }];  
    30. }  
    31.   
    32. - (void)getPlist {  
    33.     //1.管理器  
    34.     AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];  
    35.   
    36.     //2.设置response类型  
    37.     manager.responseSerializer = [AFPropertyListResponseSerializer serializer]; //是Response, 别写成request了. 修改为plist类型.  
    38.     manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/plain"]; //这个可以直接往框架里面修改.  
    39.   
    40.     //3.请求  
    41.     [manager GET:@"http://localhost/videos.plist" parameters:nil success: ^(AFHTTPRequestOperation *operation, id responseObject) {  
    42.         NSLog(@"%@", responseObject);  
    43.     } failure: ^(AFHTTPRequestOperation *operation, NSError *error) {  
    44.         NSLog(@"%@", error);  
    45.     }];  
    46. }  


    用AFN来POST JSON数据,上传、下载等。(上传、下载主页说明上有https://github.com/AFNetworking/AFNetworking

    [objc] view plaincopy
     
      1. #pragma mark - post json数据与上传文件等  
      2. - (void)postJSON {  
      3.     //1.管理器  
      4.     AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];  
      5.   
      6.     //2.设定类型. (这里要设置request-response的类型)  
      7.     manager.requestSerializer = [AFJSONRequestSerializer serializer];  
      8.     manager.responseSerializer = [AFHTTPResponseSerializer serializer]; //这个决定了下面responseObject返回的类型  
      9. //    manager.responseSerializer = [AFJSONResponseSerializer serializer];  
      10. //  manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/plain"];  
      11.       
      12.     //2.设置登录参数  
      13.     NSDictionary *dict = @{ @"username":@"xn", @"password":@"123" };  
      14.   
      15.     //3.发送请求  
      16.     [manager POST:@"http://localhost/postjson.php" parameters:dict success: ^(AFHTTPRequestOperation *operation, id responseObject) {  
      17. //      NSLog(@"postjson--> %@", responseObject);  //这样显示JSON的话需要设置text/plain  
      18.         NSString *result = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];  
      19.         NSLog(@"%@",result);  
      20.     } failure: ^(AFHTTPRequestOperation *operation, NSError *error) {  
      21.         NSLog(@"%@", error);  
      22.     }];  
      23. }
  • 相关阅读:
    【POJ 1958】 Strange Towers of Hanoi
    【HNOI 2003】 激光炸弹
    【POJ 3263】 Tallest Cow
    【POJ 2689】 Prime Distance
    【POJ 2777】 Count Color
    【POJ 1995】 Raising Modulo Numbers
    【POJ 1845】 Sumdiv
    6月16日省中集训题解
    【TJOI 2018】数学计算
    【POJ 1275】 Cashier Employment
  • 原文地址:https://www.cnblogs.com/shen5214444887/p/4837542.html
Copyright © 2011-2022 走看看