源代码地址:https://github.com/XinRan5312/YTKNetwork/
YTKNetwork是一个基于AFNetworking的网络层封装,包括以下几个核心的类
YTKBaseRequest
YTKRequest
YTKNetworkAgent
YTKNetworkConfig
YTKNetwork的基本用法:基本用法,YTKNetwork 的基本的思想是把每一个网络请求封装成对象。所以使用 YTKNetwork,你的每一种请求都需要继承 YTKRequest类,通过覆盖父类的一些方法来构造指定的网络请求。
下面会分别讲解这几个类。
YTKNetworkAgent
网络请求的总代理类,是对AFNetworking的封装。此类是一个单例。
内部包含的三个成员变量:
AFHTTPRequestOperationManager *_manager;
AFHTTPRequestOperationManagerd的单例网路请求manager对象
YTKNetworkConfig *_config;
负责配置一个相关的设置
NSMutableDictionary *_requestsRecord;
请求队列
对外的接口有以下方法:
-(void)addRequest:(YTKBaseRequest *)request;
// 这里详细分析一下addRequest的内部实现
- (void)addRequest:(YTKBaseRequest *)request {
YTKRequestMethod method = [request requestMethod];
NSString *url = [self buildRequestUrl:request];
id param = request.requestArgument;
AFConstructingBlock constructingBlock = [request constructingBodyBlock];
// 设置返回对象的格式,YTKRequestSerializerTypeHTTP代表返回二进制格式,YTKRequestSerializerTypeJSON代表返回一个json的根对象(NSDictionary或者NSArray)
if (request.requestSerializerType == YTKRequestSerializerTypeHTTP) {
_manager.requestSerializer = [AFHTTPRequestSerializer serializer];
} else if (request.requestSerializerType == YTKRequestSerializerTypeJSON) {
_manager.requestSerializer = [AFJSONRequestSerializer serializer];
}
_manager.requestSerializer.timeoutInterval = [request requestTimeoutInterval];
// 如果请求需要授权证书,这里设置用户名和密码
NSArray *authorizationHeaderFieldArray = [request requestAuthorizationHeaderFieldArray];
if (authorizationHeaderFieldArray != nil) {
[_manager.requestSerializer setAuthorizationHeaderFieldWithUsername:(NSString *)authorizationHeaderFieldArray.firstObject
password:(NSString *)authorizationHeaderFieldArray.lastObject];
}
// 设置其他HTTP header
NSDictionary *headerFieldValueDictionary = [request requestHeaderFieldValueDictionary];
if (headerFieldValueDictionary != nil) {
for (id httpHeaderField in headerFieldValueDictionary.allKeys) {
id value = headerFieldValueDictionary[httpHeaderField];
if ([httpHeaderField isKindOfClass:[NSString class]] && [value isKindOfClass:[NSString class]]) {
[_manager.requestSerializer setValue:(NSString *)value forHTTPHeaderField:(NSString *)httpHeaderField];
} else {
YTKLog(@"Error, class of key/value in headerFieldValueDictionary should be NSString.");
}
}
}
// 如果创建了自定义的NSURLRequest对象,就使用自定的对象
NSURLRequest *customUrlRequest= [request buildCustomUrlRequest];
if (customUrlRequest) {
// 创建 AFHTTPRequestOperation 对象
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:customUrlRequest];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *op, id responseObject) {
// 处理结果
[self handleRequestResult:op];
} failure:^(AFHTTPRequestOperation *op, NSError *error) {
[self handleRequestResult:op];
}];
request.requestOperation = operation;
operation.responseSerializer = _manager.responseSerializer;
// 添加到请求队列
[_manager.operationQueue addOperation:operation];
} else {
// 没有自定义NSURLRequest,需要手动创建
if (method == YTKRequestMethodGet) {
// 如果需要断点续传下载文件
if (request.resumableDownloadPath) {
// 拼接参数到url
NSString *filteredUrl = [YTKNetworkPrivate urlStringWithOriginUrlString:url appendParameters:param];