项目地址:https://github.com/purejf/BaseRequest
AFNetWorking->CYRequestManager->CYBaseRequest
封装了一下网络请求,牵扯到三个类
1. AFNetworking
2. CYRequestManager
3. CYBaseRequest
设计思路
- 先封装一下AFNetworking,即CYRequestManager
- 但是CYRequestManager需要参数、链接,参数和链接还是过于暴露,所以设计CYBaseRequest类
- 使用时继承CYBaseRequest,将类的属性作为参数(模型转JSON),将属性转化为字典参数,发送请求,即可
- 简单封装,以后逐步完善
用例1
直接使用CYBaseRequest
// 1. 创建请求
CYBaseRequest *request = [CYBaseRequest new];
request.url = @"www.baidu.com";
// 2. 发送请求
[request sendRequestWithCompletionHandle:^(BOOL success, id response, NSString *message) {
}];
}
用例2
创建一个CYUserInfoRequest继承自CYBaseRequest
CYUserInfoRequest.h
@interface CYUserInfoRequest : CYBaseRequest
@property (nonatomic, assign) NSInteger userId;
@end
CYUserInfoRequest.m
@implementation CYUserInfoRequest
- (instancetype)init {
self = [super init];
if (self) {
self.url = @"请求需要的链接";
}
return self;
}
@end
如何使用?
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 1. 创建请求
CYUserInfoRequest *userInfoR = [CYUserInfoRequest new];
userInfoR.userId = 1;
// 在.m中可以设置
// userInfoR.url = @"www.baidu.com";
// 可选
// userInfoR.extraParams = @{
// @"username" : @"xxx"
// };
// 2. 设置请求方式
userInfoR.methodType = CYRequestMethodTypePOST;
// 3. 发送请求
[userInfoR sendRequestWithCompletionHandle:^(BOOL success, id response, NSString *message) {
}];
}
@end
}
设计代码示例 - CYRequestManager
#import "AFNetworking.h"
#import "CYRequestConstant.h"
// 请求成功回调
typedef void(^CYRequestManagerSuccessHandle)(NSURLSessionTask *task, id response);
// 请求失败回调
typedef void(^CYRequestManagerFailureHandle)(NSURLSessionTask *task, NSError *error);
@interface CYRequestManager : NSObject
/**
request By NSURLSession
@param URLString 请求链接
@param params 请求参数
@param methodType 请求方式
@param serializerType 数据解析类型
@param successHandle 请求成功回调
@param failureHandle 请求失败回调
*/
+ (void)requestWithURLString:(NSString *)URLString
params:(NSDictionary *)params
methodType:(CYRequestMethodType)methodType
serializerType:(CYResponseSeializerType)serializerType
successHandle:(CYRequestManagerSuccessHandle)successHandle
failureHandle:(CYRequestManagerFailureHandle)failureHandle;
/**
a multipart `POST` request By NSURLSession
@param URLString 请求链接
@param params 请求参数
@param serializerType 数据解析类型
@param constructingBody 添加请求体
@param successHandle 请求成功回调
@param failureHandle 请求失败回调
*/
+ (void)POSTWithURLString:(NSString *)URLString
params:(NSDictionary *)params
serializerType:(CYResponseSeializerType)serializerType
constructingBody:(void (^)(id<AFMultipartFormData> formData))constructingBody
successHandle:(CYRequestManagerSuccessHandle)successHandle
failureHandle:(CYRequestManagerFailureHandle)failureHandle;
@end
#import "CYRequestManager.h"
#import "AFNetworking.h"
@interface AFHTTPSessionManager (Shared)
+ (instancetype)sharedManager;
@end
@implementation AFHTTPSessionManager (Shared)
+ (instancetype)sharedManager {
static AFHTTPSessionManager *_singleton;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_singleton = [AFHTTPSessionManager manager];
_singleton.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/plain", @"text/json", @"text/javascript", @"text/html", nil];
});
return _singleton;
}
@end
@implementation CYRequestManager
+ (void)requestWithURLString:(NSString *)URLString
params:(NSDictionary *)params
methodType:(CYRequestMethodType)methodType
serializerType:(CYResponseSeializerType)serializerType
successHandle:(CYRequestManagerSuccessHandle)successHandle
failureHandle:(CYRequestManagerFailureHandle)failureHandle {
AFHTTPSessionManager *manager = [AFHTTPSessionManager sharedManager];
manager.responseSerializer = [self responseSearalizerWithSerilizerType:serializerType];
switch (methodType) {
case CYRequestMethodTypeGET: [manager GET:URLString parameters:params progress:nil success:successHandle failure:failureHandle]; break;
case CYRequestMethodTypePOST: [manager POST:URLString parameters:params progress:nil success:successHandle failure:failureHandle]; break;
case CYRequestMethodTypePUT: [manager PUT:URLString parameters:params success:successHandle failure:failureHandle]; break;
case CYRequestMethodTypePATCH: [manager PATCH:URLString parameters:params success:successHandle failure:failureHandle]; break;
case CYRequestMethodTypeDELETE: [manager DELETE:URLString parameters:params success:successHandle failure:failureHandle]; break;
case CYRequestMethodTypeHEAD: [manager HEAD:URLString parameters:params success:^(NSURLSessionDataTask * _Nonnull task) {
!successHandle ?: successHandle(task, nil);
} failure:failureHandle]; break;
}
}
+ (void)POSTWithURLString:(NSString *)URLString
params:(NSDictionary *)params
serializerType:(CYResponseSeializerType)serializerType
constructingBody:(void (^)(id<AFMultipartFormData> formData))constructingBody
successHandle:(CYRequestManagerSuccessHandle)successHandle
failureHandle:(CYRequestManagerFailureHandle)failureHandle {
AFHTTPSessionManager *manager = [AFHTTPSessionManager sharedManager];
manager.responseSerializer = [self responseSearalizerWithSerilizerType:serializerType];
[manager POST:URLString parameters:params constructingBodyWithBlock:constructingBody progress:nil success:successHandle failure:failureHandle];
}
+ (AFHTTPResponseSerializer *)responseSearalizerWithSerilizerType:(CYResponseSeializerType)serilizerType {
switch (serilizerType) {
case CYResponseSeializerTypeDefault: return [AFJSONResponseSerializer serializer]; break;
case CYResponseSeializerTypeJSON: return [AFJSONResponseSerializer serializer]; break;
case CYResponseSeializerTypeXML: return [AFXMLParserResponseSerializer serializer]; break;
case CYResponseSeializerTypePlist: return [AFPropertyListResponseSerializer serializer]; break;
case CYResponseSeializerTypeCompound: return [AFCompoundResponseSerializer serializer]; break;
case CYResponseSeializerTypeImage: return [AFImageResponseSerializer serializer]; break;
case CYResponseSeializerTypeData: return [AFHTTPResponseSerializer serializer]; break;
default: return [AFJSONResponseSerializer serializer]; break;
}
}
@end
设计代码示例 - CYBaseRequest
#import "CYRequestConstant.h"
typedef void(^CYBaseRequestCompletionHandle)(BOOL success, id response, NSString *message);
@interface CYBaseRequest : NSObject
@property (nonatomic, copy) NSString *url;
@property (nonatomic, assign) CYRequestMethodType methodType;
@property (nonatomic, strong) NSDictionary *extraParams;
- (void)sendRequestWithCompletionHandle:(CYBaseRequestCompletionHandle)completionHandle;
@end
#import "CYBaseRequest.h"
#import "YYModel.h"
#import "CYRequestManager.h"
@implementation CYBaseRequest
- (void)sendRequestWithCompletionHandle:(CYBaseRequestCompletionHandle)completionHandle {
if (!_url || !_url.length) return;
[CYRequestManager requestWithURLString:_url
params:[self params]
methodType:self.methodType
serializerType:CYResponseSeializerTypeJSON
successHandle:^(NSURLSessionTask *task, id response) {
!completionHandle ?: completionHandle(YES, response, nil);
} failureHandle:^(NSURLSessionTask *task, NSError *error) {
!completionHandle ?: completionHandle(NO, nil, error.description);
}];
}
- (NSDictionary *)params {
NSDictionary *json = self.yy_modelToJSONObject;
if ([json isKindOfClass:[NSDictionary class]]) {
NSMutableDictionary *params = [(NSDictionary *)json mutableCopy];
[params addEntriesFromDictionary:self.extraParams];
for (NSString *delKey in @[@"url", @"methodType", @"extraParams"]) {
if ([params.allKeys containsObject:delKey]) {
[params removeObjectForKey:delKey];
}
}
for (id key in params.allKeys) {
id obj = [params objectForKey:key];
if (!obj || [obj isKindOfClass:[NSNull class]] || obj == (id)kCFNull) {
[params removeObjectForKey:key];
}
}
return params;
}
return self.extraParams;
}
@end
网友评论
如:在对AFN进行封装后的第二层,通过一个类,使用类方法传入参数,内部设置url,像这样 + (NSURLSessionDataTask *)getUserFollowListWithParam:(NSDictionary*)param completeHandler:(CompleteHandler)completeHandler;,内部调用对AFN封装后的网络请求单例
您的这种方式有什么好处,相比较
,正需要。