AFNetworking

NSURLSession

NSURLSession获取HTTP请求数据步骤:

  1. 实例化一个NSURLRequest/NSMutalbeRequest,设置要请求的url
  2. 获取NSUrlSession实例
  3. 通过dataWithRequest:completionHandle:返回一个dataTask
  4. 向该对象发送消息resume执行这个任务
  5. completion中 将对象编码 返回字符串
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[[NSURL alloc] initWithString:@"https://github.com"]];
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request
                                       completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
                                           NSString *dataStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
                                           NSLog(@"%@", dataStr);
                                       }];
[task resume];

AFNetworking

AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:[[NSURL alloc] initWithString:@"hostname"]];
[manager GET:@"relative_url" parameters:nil progress:nil
    success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        NSLog(@"%@" ,responseObject);
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"%@", error);
    }];

AFNetworking默认接收json格式的响应,如果想要其它格式的 设置acceptableContentTypes

AFNetworking的调用栈

  1. AFHTTPSessionManager的初始化方法- initWithBaseURL:

    - [AFHTTPSessionManager initWithBaseURL:]
        - [AFHTTPSessionManager initWithBaseURL:sessionConfiguration:]
    - [AFURLSessionManager initWithSessionConfiguration:]
    - [NSURLSession sessionWithConfiguration:delegate:delegateQueue:]
    - [AFJSONResponseSerializer serializer] // 负责序列化响应
    - [AFSecurityPolicy defaultPolicy] // 负责身份认证
    - [AFNetworkReachabilityManager sharedManager] // 查看网络连接情况
    - [AFHTTPRequestSerializer serializer] // 负责序列化请求
    - [AFJSONResponseSerializer serializer] // 负责序列化响应
    • 其中AFURLSessionManagerAFHTTPSessionManager的父类
    • AFURLSessionManager负责生成NSURLSession实例,并且管理AFSecurityPolicyAFNetworkReachabilityManager,来保证请求的安全和查看网络连接情况,AFJSONResponseSerializer实例用来序列号HTTP响应
    • AFHTTPSessionManager有自己的AFHTTPRequestSerializerAFJSONResponseSerializer来管理请求和响应的序列化,同时依赖父类提供的接口保证安全、监控网络状态,实现发送HTTP
  2. GET:Params:progress:success:的调用栈

    - [AFHTTPSessionManager GET:parameters:process:success:failure:]
        - [AFHTTPSessionManager dataTaskWithHTTPMethod:parameters:uploadProgress:downloadProgress:success:failure:] // 返回 NSURLSessionDataTask #1
    - [AFHTTPRequestSerializer requestWithMethod:URLString:parameters:error:] // 返回 NSMutableURLRequest
    - [AFURLSessionManager dataTaskWithRequest:uploadProgress:downloadProgress:completionHandler:] // 返回 NSURLSessionDataTask #2
    - [NSURLSession dataTaskWithRequest:] // 返回 NSURLSessionDataTask #3
    - [AFURLSessionManager addDelegateForDataTask:uploadProgress:downloadProgress:completionHandler:]
    - [AFURLSessionManagerTaskDelegate init]
    - [AFURLSessionManager setDelegate:forTask:]
    - [NSURLSessionDataTask resume]

    在#3出调用了系统的请求方法,返回dataTask 然后调用resume方法执行请求,并在某些实践之星时通知代理AFURLSessionManagerTaskDelegate