AFNetworking总体分析

大体模块如下:

AFNetworking模块.png

除去Support Files,可以看出AFNetworking主要有5个模块

1.NSURLSession(网络通信模块)
2.Reachability(网络状态检测模块)
3.Security(网络安全模块)
4.Serialization(序列化/反序列化模块)
5.UIKit(对iOS UIKit的扩展)

NSURLSession(网络通信模块)

AFHTTPSessionManagerAFURLSessionManager组成,通常我们在使用AFNetworking时,都是使用AFHTTPSessionManagerAFHTTPSessionManager继承自AFURLSessionManager,是对AFURLSessionManager的进一步封装,封装了许多繁琐的API,仅留下GETPOST等少数几个实用的API

AFHTTPSessionManager.png

最基本的使用方式如下:

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
[manager POST:@"" parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        NSLog(@"success");
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"failure");
    }];

Reachability(网络状态检测模块)

用于获取设备的网络状态,AFNetworkReachabilityStatus表示不同的网络状态,是枚举类型

typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) {
    //未知网络
    AFNetworkReachabilityStatusUnknown          = -1,
    //无网络
    AFNetworkReachabilityStatusNotReachable     = 0,
    //手机流量
    AFNetworkReachabilityStatusReachableViaWWAN = 1,
    //wifi
    AFNetworkReachabilityStatusReachableViaWiFi = 2,
};

最基本的使用方式如下:

AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager manager];
 [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
        switch (status) {
            case AFNetworkReachabilityStatusNotReachable: {
                NSLog(@"网络不可用");
                break;
            }
                
            case AFNetworkReachabilityStatusReachableViaWiFi: {
                NSLog(@"Wifi已开启");
                break;
            }
                
            case AFNetworkReachabilityStatusReachableViaWWAN: {
                NSLog(@"你现在使用的流量");
                break;
            }
                
            case AFNetworkReachabilityStatusUnknown: {
                NSLog(@"你现在使用的未知网络");
                break;
            }
            default:{
                NSLog(@"error");
                break;
            }
        }
    }];
[manager startMonitoring];

Security(网络安全模块)

AFSecurityPolicy用于验证HTTP请求时证书是否正确,避免中间人攻击,SSLPinningMode是校验证书的模式,是枚举类型

typedef NS_ENUM(NSUInteger, AFSSLPinningMode) {
    //默认
    AFSSLPinningModeNone,
    //比较证书的公钥
    AFSSLPinningModePublicKey,
    //比较证书
    AFSSLPinningModeCertificate,
};

AFSecurityPolicy提供的SSL Pinning的方式验证,把服务端下发的证书保存在APP的bundle中,之后通过和本地证书的比较来验证是否安全,获取bundle中的证书用以下方法:

+ (NSSet  *)certificatesInBundle:(NSBundle *)bundle;

AFSSLPinningModeNone:默认的方式,不做SSL pinning验证,跟浏览器一样在系统信任机构列表里验证服务端返回的证书,若证书是信任机构签发的,则通过,否则不通过(使用个人服务器证书时)
AFSSLPinningModeCertificate:采用SSL Pinning的方式,首先验证服务器证书的有效期、身份信息等,然后将该证书和bundle中证书进行比较,是否一致。
AFSSLPinningModePublicKey:采用SSL Pinning的方式,但不验证有效期,身份信息等信息,仅仅比较两个证书的公钥是否一致。

Serialization(序列化/反序列化模块)

由对请求配置封装的AFURLRequestSerialization和对相应配置封装的AFURLResponseSerialization组成
在使用AFHTTPSessionManager时,会在init方法中初始化AFURLRequestSerializationAFURLResponseSerialization

- (instancetype)initWithBaseURL:(NSURL *)url
           sessionConfiguration:(NSURLSessionConfiguration *)configuration
{
    //····省略前边的代码

    self.requestSerializer = [AFHTTPRequestSerializer serializer];
    self.responseSerializer = [AFJSONResponseSerializer serializer];

    return self;
}

当然,在实际使用时可以根据需求对AFURLRequestSerializationAFURLResponseSerialization进行一定的配置,比如:

manager.requestSerializer = [AFJSONRequestSerializer serializer];//请求格式为json
manager.responseSerializer = [AFJSONResponseSerializer serializer];//返回格式为json

AFURLRequestSerialization的类型如下:

//二进制格式
@interface AFHTTPRequestSerializer : NSObject 
//json格式
@interface AFJSONRequestSerializer : AFHTTPRequestSerializer
//PList格式
@interface AFPropertyListRequestSerializer : AFHTTPRequestSerializer

AFURLResponseSerialization的类型如下:

//二进制格式
@interface AFHTTPResponseSerializer : NSObject 
//返回JSON格式
//- `application/json`
// - `text/json`
// - `text/javascript`
@interface AFJSONResponseSerializer : AFHTTPResponseSerializer
//XML,只能返回XMLParser,还需要自己通过代理方法解析
// - `application/xml`
// - `text/xml`
@interface AFXMLParserResponseSerializer : AFHTTPResponseSerializer
//XML
// - `application/xml`
// - `text/xml`
#ifdef __MAC_OS_X_VERSION_MIN_REQUIRED
@interface AFXMLDocumentResponseSerializer : AFHTTPResponseSerializer
//PList
//- `application/x-plist`
@interface AFPropertyListResponseSerializer : AFHTTPResponseSerializer
//Image
// - `image/tiff`
// - `image/jpeg`
// - `image/gif`
// - `image/png`
// - `image/ico`
// - `image/x-icon`
// - `image/bmp`
// - `image/x-bmp`
// - `image/x-xbitmap`
// - `image/x-win-bitmap`
@interface AFImageResponseSerializer : AFHTTPResponseSerializer
//组合
@interface AFCompoundResponseSerializer : AFHTTPResponseSerializer

在使用AFHTTPSessionManager时对AFURLRequestSerializationAFURLResponseSerialization进行配置如下:

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    
    // 设置请求格式
    manager.requestSerializer = [AFJSONRequestSerializer serializer];
    
    // 设置请求头
    [manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    
    // 设置接收格式
    manager.responseSerializer = [AFJSONResponseSerializer serializer];
    
    // 设置接收的Content-Type
    manager.responseSerializer.acceptableContentTypes = [[NSSet alloc] initWithObjects:@"application/xml", @"text/xml",@"text/html", @"application/json",@"text/plain",nil];

你可能感兴趣的:(AFNetworking总体分析)