iOS AFNetworking 源码解析

https://github.com/AFNetworking/AFNetworking

一、AFNetworking主要分为四大模块:

  • NSURLSession(会话管理器)
  • Reachability(网络管理器)
  • Security(安全策略)
  • Serialization(请求序列化与响应)

二、AFSecurityPolicy.m

AFN提供的三种安全策略:

typedef NS_ENUM(NSUInteger, AFSSLPinningMode) {

    AFSSLPinningModeNone,//无校验

    AFSSLPinningModePublicKey,//公钥校验

    AFSSLPinningModeCertificate,//证书校验

};

三个类方法初始化安全策略:

  • 1、默认的安全策略,不允许无效的证书,需要验证域名,不会对固定的证书和公钥做校验;
+ (instancetype)defaultPolicy;
  • 2、创建并返回一个指定安全模式的策略;
+ (instancetype)policyWithPinningMode:(AFSSLPinningMode)pinningMode;

3、创建并返回一个指定安全模式并绑定证书的安全策略。

+ (instancetype)policyWithPinningMode:(AFSSLPinningMode)pinningMode withPinnedCertificates:(NSSet <NSData *> *)pinnedCertificates;

三、AFNetworkReachabilityManager.m

AFN提供的四种网络状态:

typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) {

    AFNetworkReachabilityStatusUnknown          = -1,//未知网络

    AFNetworkReachabilityStatusNotReachable    = 0,//没网络

    AFNetworkReachabilityStatusReachableViaWWAN = 1,//蜂窝网络

    AFNetworkReachabilityStatusReachableViaWiFi = 2,//wifi

};

五种初始化方式:

//返回有默认套接字地址的网络管理器单例;

+ (instancetype)sharedManager;

//返回有默认套接字地址的网络管理器;

+ (instancetype)manager;

//返回有指定域的网络管理器;

+ (instancetype)managerForDomain:(NSString *)domain;

//创建并返回具有自定义套接字地址的网络管理器

+ (instancetype)managerForAddress:(const void *)address;

//通过系统的网络检测对象初始化网络管理器

+ (instancetype)initWithReachability:(SCNetworkReachabilityRef)reachability NS_DESIGNATED_INITIALIZER;

网络状态改变时,block回调:

- (void)setReachabilityStatusChangeBlock:(nullable void (^)(AFNetworkReachabilityStatus status))block;

四、AFURLRequestSerialization.m

暂定一种HTTP请求序列化类型:

typedef NS_ENUM(NSUInteger, AFHTTPRequestQueryStringSerializationStyle) {

    AFHTTPRequestQueryStringDefaultStyle = 0,

};

AFURLRequestSerialization协议:返回一个带指定参数的序列化请求。

AFHTTPRequestSerializer类(遵守AFURLRequestSerialization协议):

对序列化参数进行编码、是否可以用手机流量创建网络、创建请求的缓存策略、创建cookies处理方式、是否在接收请求响应之前继续发送请求、设置超时时间、设置获取请求头信息、设置清除http auth信息、默认和自定义查询字符串序列化方法。

三种创建并返回可变url请求的方法:

//默认方法

- (NSMutableURLRequest *)requestWithMethod:(NSString *)method

                                URLString:(NSString *)URLString

                                parameters:(nullable id)parameters

                                    error:(NSError * _Nullable __autoreleasing *)error;

//自定义block方法

- (NSMutableURLRequest *)multipartFormRequestWithMethod:(NSString *)method

                                              URLString:(NSString *)URLString

                                            parameters:(nullable NSDictionary <NSString *, id> *)parameters

                              constructingBodyWithBlock:(nullable void (^)(id <AFMultipartFormData> formData))block

                                                  error:(NSError * _Nullable __autoreleasing *)error;

//删除HTTPBodySteam

- (NSMutableURLRequest *)requestWithMultipartFormRequest:(NSURLRequest *)request

                            writingStreamContentsToFile:(NSURL *)fileURL

                                      completionHandler:(nullable void (^)(NSError * _Nullable error))handler;

AFJSONRequestSerializer:专门用来处理类型为json的请求。

AFPropertyListRequestSerializer:专门用来处理类型为x-plist的请求。

五、AFURLResponseSerialization.m

1、AFURLResponseSerialization协议:返回一个带指定参数的序列化响应协议。
2、AFHTTPResponseSerializer类:初始化响应类、设置响应可接受的状态码、设置响应可接受的Content - Type类型、是否返回有效的响应。
3、AFJSONResponseSerializer:检验和解码application/json、text/json、text/javascript类型的响应。
4、AFXMLParserResponseSerializer:检验和解码application/xml、text/xml类型的响应。
5、AFXMLDocumentResponseSerializer:检验和解码application/xml、text/xml文档类型的响应。
6、AFPropertyListResponseSerializer:检验和解码x-plist类型的响应。
7、AFImageResponseSerializer:检验和解码UIImage和NSImage类型的响应。
8、AFCompoundResponseSerializer:检验和解码多种潜在类型的响应

六、AFURLSessionManager.m

两种初始化方法:

//根据配置信息初始化网络会话

- (instancetype)initWithSessionConfiguration:(NSURLSessionConfiguration *)configuration;

//配置信息为nil,初始化网络会话

- (instancetype)init;

取消网络操作:

//是否取消任务,使网络会话失效

- (void)invalidateSessionCancelingTasks:(BOOL)cancelPendingTasks;

创建普通网络会话:

//根据请求信息创建网络会话

- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request

                            completionHandler:(nullable void (^)(NSURLResponse *response, id _Nullable responseObject,  NSError * _Nullable error))completionHandler DEPRECATED_ATTRIBUTE;

//根据请求信息创建可以查询上传、下载进度的网络会话                           

- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request

                              uploadProgress:(nullable void (^)(NSProgress *uploadProgress))uploadProgressBlock

                            downloadProgress:(nullable void (^)(NSProgress *downloadProgress))downloadProgressBlock

                            completionHandler:(nullable void (^)(NSURLResponse *response, id _Nullable responseObject,  NSError * _Nullable error))completionHandler;

创建上传网络会话:

//根据请求信息和文件url创建可以查询上传进度的网络会话

- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request

                                        fromFile:(NSURL *)fileURL

                                        progress:(nullable void (^)(NSProgress *uploadProgress))uploadProgressBlock

                                completionHandler:(nullable void (^)(NSURLResponse *response, id _Nullable responseObject, NSError  * _Nullable error))completionHandler;

//根据请求信息和要上传的数据创建可以查询上传进度的网络会话           

- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request

                                        fromData:(nullable NSData *)bodyData

                                        progress:(nullable void (^)(NSProgress *uploadProgress))uploadProgressBlock

                                completionHandler:(nullable void (^)(NSURLResponse *response, id _Nullable responseObject, NSError * _Nullable error))completionHandler;

//根据请求和输入流创建可以查询上传进度的网络会话

- (NSURLSessionUploadTask *)uploadTaskWithStreamedRequest:(NSURLRequest *)request

                                                progress:(nullable void (^)(NSProgress *uploadProgress))uploadProgressBlock

                                        completionHandler:(nullable void (^)(NSURLResponse *response, id _Nullable responseObject, NSError * _Nullable error))completionHandler;

设置网络请求的回调:

//设置会话失效时回调的block

- (void)setSessionDidBecomeInvalidBlock:(nullable void (^)(NSURLSession *session, NSError *error))block;

//设置对接收到的http auth进行校验时,回调的block。

- (void)setSessionDidReceiveAuthenticationChallengeBlock:(nullable NSURLSessionAuthChallengeDisposition (^)(NSURLSession *session, NSURLAuthenticationChallenge *challenge, NSURLCredential * _Nullable __autoreleasing * _Nullable credential))block;

//设置新的输入流时,回调的block。

- (void)setTaskNeedNewBodyStreamBlock:(nullable NSInputStream * (^)(NSURLSession *session, NSURLSessionTask *task))block;

//设置HTTP重定向时,回调的block。

- (void)setTaskWillPerformHTTPRedirectionBlock:(nullable NSURLRequest * _Nullable (^)(NSURLSession *session, NSURLSessionTask *task, NSURLResponse *response, NSURLRequest *request))block;

//设置对接收到的http auth进行校验时,回调的block。

- (void)setTaskDidReceiveAuthenticationChallengeBlock:(nullable NSURLSessionAuthChallengeDisposition (^)(NSURLSession *session, NSURLSessionTask *task, NSURLAuthenticationChallenge *challenge, NSURLCredential * _Nullable __autoreleasing * _Nullable credential))block;

//设置发送的数据时,回调的block。

- (void)setTaskDidSendBodyDataBlock:(nullable void (^)(NSURLSession *session, NSURLSessionTask *task, int64_t bytesSent, int64_t totalBytesSent, int64_t totalBytesExpectedToSend))block;

//完成网络任务时进行设置

- (void)setTaskDidCompleteBlock:(nullable void (^)(NSURLSession *session, NSURLSessionTask *task, NSError * _Nullable error))block;

//接收到响应时,回调block

- (void)setDataTaskDidReceiveResponseBlock:(nullable NSURLSessionResponseDisposition (^)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSURLResponse *response))block;

//当下载任务完成时,设置网络任务

- (void)setDataTaskDidBecomeDownloadTaskBlock:(nullable void (^)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSURLSessionDownloadTask *downloadTask))block;

//当数据接收到时,设置网络任务

- (void)setDataTaskDidReceiveDataBlock:(nullable void (^)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSData *data))block;

//临时缓存时设置任务

- (void)setDataTaskWillCacheResponseBlock:(nullable NSCachedURLResponse * (^)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSCachedURLResponse *proposedResponse))block;

//当所有的任务发送出去以后,回调block

- (void)setDidFinishEventsForBackgroundURLSessionBlock:(nullable void (^)(NSURLSession *session))block;

//当下载任务完成时,回调block

- (void)setDownloadTaskDidFinishDownloadingBlock:(nullable NSURL * _Nullable  (^)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, NSURL *location))block;

//下载时,写入数据的回调block

- (void)setDownloadTaskDidWriteDataBlock:(nullable void (^)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, int64_t bytesWritten, int64_t totalBytesWritten, int64_t totalBytesExpectedToWrite))block;

//设置断点续传的block

- (void)setDownloadTaskDidResumeBlock:(nullable void (^)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, int64_t fileOffset, int64_t expectedTotalBytes))block;

七、AFHTTPSessionManager.m

四种初始化方法:

//url和配置信息都是nil

+ (instancetype)manager;

//url和配置信息都是nil

+ (instancetype)init;

//配置信息是nil

- (instancetype)initWithBaseURL:(nullable NSURL *)url;

//url是nil

- (instancetype)initWithBaseURL:(nullable NSURL *)url

          sessionConfiguration:(nullable NSURLSessionConfiguration *)configuration;

//url和配置信息都是nil

+ (instancetype)manager;

//url和配置信息都是nil

+ (instancetype)init;

//配置信息是nil

- (instancetype)initWithBaseURL:(nullable NSURL *)url;

//url是nil

- (instancetype)initWithBaseURL:(nullable NSURL *)url

          sessionConfiguration:(nullable NSURLSessionConfiguration *)configuration;

网络请求方法[Get,Post,Put,Patch,Delete,Head]:

//GET请求

- (nullable NSURLSessionDataTask *)GET:(NSString *)URLString

                  parameters:(nullable id)parameters

                      success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success

                      failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure;

//可查询下载进度的GET请求

- (nullable NSURLSessionDataTask *)GET:(NSString *)URLString

                            parameters:(nullable id)parameters

                              progress:(nullable void (^)(NSProgress *downloadProgress))downloadProgress

                              success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success

                              failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure;

//HEAD请求

- (nullable NSURLSessionDataTask *)HEAD:(NSString *)URLString

                    parameters:(nullable id)parameters

                      success:(nullable void (^)(NSURLSessionDataTask *task))success

                      failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure;

//POST请求

- (nullable NSURLSessionDataTask *)POST:(NSString *)URLString

                    parameters:(nullable id)parameters

                      success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success

                      failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure DEPRECATED_ATTRIBUTE;

//可查询上传进度的POST请求

- (nullable NSURLSessionDataTask *)POST:(NSString *)URLString

                            parameters:(nullable id)parameters

                              progress:(nullable void (^)(NSProgress *uploadProgress))uploadProgress

                                success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success

                                failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure;

//根据表单类型,构建POST网络请求

- (nullable NSURLSessionDataTask *)POST:(NSString *)URLString

                    parameters:(nullable id)parameters

    constructingBodyWithBlock:(nullable void (^)(id <AFMultipartFormData> formData))block

                      success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success

                      failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure DEPRECATED_ATTRIBUTE;

//PUT请求

- (nullable NSURLSessionDataTask *)POST:(NSString *)URLString

                            parameters:(nullable id)parameters

              constructingBodyWithBlock:(nullable void (^)(id <AFMultipartFormData> formData))block

                              progress:(nullable void (^)(NSProgress *uploadProgress))uploadProgress

                                success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success

                                failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure;//根据表单类型,构建POST网络请求,可查询上传进度

- (nullable NSURLSessionDataTask *)PUT:(NSString *)URLString

                  parameters:(nullable id)parameters

                      success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success

                      failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure;

//PATCH请求

- (nullable NSURLSessionDataTask *)PATCH:(NSString *)URLString

                    parameters:(nullable id)parameters

                        success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success

                        failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure;

//DELETE请求

- (nullable NSURLSessionDataTask *)DELETE:(NSString *)URLString

                      parameters:(nullable id)parameters

                        success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success

                        failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure;

//GET请求

- (nullable NSURLSessionDataTask *)GET:(NSString *)URLString

                  parameters:(nullable id)parameters

                      success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success

                      failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure;

//可查询下载进度的GET请求

- (nullable NSURLSessionDataTask *)GET:(NSString *)URLString

                            parameters:(nullable id)parameters

                              progress:(nullable void (^)(NSProgress *downloadProgress))downloadProgress

                              success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success

                              failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure;

//HEAD请求

- (nullable NSURLSessionDataTask *)HEAD:(NSString *)URLString

                    parameters:(nullable id)parameters

                      success:(nullable void (^)(NSURLSessionDataTask *task))success

                      failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure;

//POST请求

- (nullable NSURLSessionDataTask *)POST:(NSString *)URLString

                    parameters:(nullable id)parameters

                      success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success

                      failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure DEPRECATED_ATTRIBUTE;

//可查询上传进度的POST请求

- (nullable NSURLSessionDataTask *)POST:(NSString *)URLString

                            parameters:(nullable id)parameters

                              progress:(nullable void (^)(NSProgress *uploadProgress))uploadProgress

                                success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success

                                failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure;

//根据表单类型,构建POST网络请求

- (nullable NSURLSessionDataTask *)POST:(NSString *)URLString

                    parameters:(nullable id)parameters

    constructingBodyWithBlock:(nullable void (^)(id <AFMultipartFormData> formData))block

                      success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success

                      failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure DEPRECATED_ATTRIBUTE;

//PUT请求

- (nullable NSURLSessionDataTask *)POST:(NSString *)URLString

                            parameters:(nullable id)parameters

              constructingBodyWithBlock:(nullable void (^)(id <AFMultipartFormData> formData))block

                              progress:(nullable void (^)(NSProgress *uploadProgress))uploadProgress

                                success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success

                                failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure;//根据表单类型,构建POST网络请求,可查询上传进度

- (nullable NSURLSessionDataTask *)PUT:(NSString *)URLString

                  parameters:(nullable id)parameters

                      success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success

                      failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure;

//PATCH请求

- (nullable NSURLSessionDataTask *)PATCH:(NSString *)URLString

                    parameters:(nullable id)parameters

                        success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success

                        failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure;

//DELETE请求

- (nullable NSURLSessionDataTask *)DELETE:(NSString *)URLString

                      parameters:(nullable id)parameters

                        success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success

                        failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,825评论 4 377
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,887评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,425评论 0 255
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,801评论 0 224
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,252评论 3 299
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,089评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,216评论 2 322
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 31,005评论 0 215
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,747评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,883评论 2 255
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,354评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,694评论 3 265
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,406评论 3 246
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,222评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,996评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,242评论 2 287
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 36,017评论 2 281