//IceRequestManager.h
#import <Foundation/Foundation.h>
#import <AFNetworking.h>
typedef NS_ENUM(NSInteger, iceRequstType) {
iceRequstTypeGET = 0,
iceRequstTypePOST,
iceRequstTypePUT,
iceRequstTypePATCH,
iceRequstTypeDELETE,
};
@interface IceRequestManager : NSObject
+ (void)request: (iceRequstType)type URL:(NSString *)urlString Header:(void (^)(AFHTTPRequestSerializer *header))header Parameter:(void (^)(NSMutableDictionary *param))parameter Progress:(void (^)(NSProgress *rate))progress Success:(void (^)(id response))success Failure:(void (^)(NSError *error))failure;
+ (void)cancelRequest;
@end
//IceRequestManager.m
#import "IceRequestManager.h"
#define iceWeakSelf __weak typeof(self) weakSelf = self;
#define iceStrongSelf __strong typeof(self) strongSelf = weakSelf;
@interface IceRequestManager ()
@property(strong, nonatomic)AFHTTPSessionManager *afnManager;
@end
@implementation IceRequestManager
#pragma 單例
static IceRequestManager* _manager = nil;
+ (instancetype)manager {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_manager = [[super allocWithZone:NULL] init];
});
return _manager;
}
+ (id)allocWithZone: (struct _NSZone *)zone {
return [self manager];
}
- (id)copyWithZone: (struct _NSZone *)zone {
return [[self class] manager];
}
/*=================================================================================================*/
#pragma 獲得afnManager
- (AFHTTPSessionManager *)afnManager {
if (!_afnManager) {
//初始化
AFHTTPSessionManager *afnManager = [AFHTTPSessionManager manager];
//https
AFSecurityPolicy * policy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
policy.allowInvalidCertificates = YES;
policy.validatesDomainName = NO;
afnManager.securityPolicy = policy;
_afnManager = afnManager;
}
return _afnManager;
}
/*=================================================================================================*/
#pragma 類方法
+ (void)request: (iceRequstType)type URL:(NSString *)urlString Header:(void (^)(AFHTTPRequestSerializer *header))header Parameter:(void (^)(NSMutableDictionary *param))parameter Progress:(void (^)(NSProgress *rate))progress Success:(void (^)(id response))success Failure:(void (^)(NSError *error))failure {
[[self manager] request:type URL:urlString Header:header Parameter:parameter Progress:progress Success:success Failure:failure];
}
+ (void)cancelRequest {
[[self manager] cancelRequest];
}
/*=================================================================================================*/
#pragma 實例方法
- (void)request: (iceRequstType)type URL:(NSString *)urlString Header:(void (^)(AFHTTPRequestSerializer *header))header Parameter:(void (^)(NSMutableDictionary *param))parameter Progress:(void (^)(NSProgress *rate))progress Success:(void (^)(id response))success Failure:(void (^)(NSError *error))failure {
//設置請求頭、參數(shù)
NSMutableDictionary *paramM = [self handelHeader:header Parameter:parameter];
iceWeakSelf
switch (type) {
case iceRequstTypeGET: {
[self.afnManager GET:urlString parameters:paramM progress:progress success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
[weakSelf handelSuccess:responseObject success:success];
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
[weakSelf handelError:error task:task failure:failure];
}];
}
break;
case iceRequstTypePOST: {
[self.afnManager POST:urlString parameters:paramM progress:progress success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
[weakSelf handelSuccess:responseObject success:success];
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
[weakSelf handelError:error task:task failure:failure];
}];
}
break;
case iceRequstTypePUT: {
[self.afnManager PUT:urlString parameters:paramM success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
[weakSelf handelSuccess:responseObject success:success];
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
[weakSelf handelError:error task:task failure:failure];
}];
}
break;
case iceRequstTypePATCH: {
[self.afnManager PATCH:urlString parameters:paramM success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
[weakSelf handelSuccess:responseObject success:success];
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
[weakSelf handelError:error task:task failure:failure];
}];
}
break;
case iceRequstTypeDELETE: {
[self.afnManager DELETE:urlString parameters:paramM success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
[weakSelf handelSuccess:responseObject success:success];
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
[weakSelf handelError:error task:task failure:failure];
}];
}
break;
default:
break;
}
}
- (void)cancelRequest {
[self.afnManager.session invalidateAndCancel];
}
/*=================================================================================================*/
#pragma 請求頭和參數(shù)的處理
- (NSMutableDictionary *)handelHeader:(void (^)(AFHTTPRequestSerializer *))header Parameter:(void (^)(NSMutableDictionary *))parameter{
//設置請求頭
self.afnManager.requestSerializer = [AFJSONRequestSerializer serializer];
//self.afnManager.requestSerializer setValue:@"" forHTTPHeaderField:@"";
if (header) {
header(self.afnManager.requestSerializer);
}
//設置請求參數(shù)
NSMutableDictionary *paramM = [NSMutableDictionary dictionary];
//paramM setValue:@"" forKey:@"";
if (parameter) {
parameter(paramM);
}
return paramM;
}
#pragma 處理回調(diào)
//成功
- (void)handelSuccess: (id)responseObject success:(void (^)(id))success {
if (responseObject[@"data"]) {
if ([responseObject[@"code"] integerValue] == 0) {
if (success) {
success(responseObject[@"data"]);
}
}else {
NSLog(@"code錯誤!==> %@ /n", responseObject);
}
}else {
if (success) {
success(responseObject);
}
}
}
//失敗
- (void)handelError: (NSError *)error task: (NSURLSessionDataTask *)task failure:(void (^)(NSError *))failure {
if (failure) {
failure(error);
}
NSHTTPURLResponse * responses = (NSHTTPURLResponse *)task.response;
NSLog(@"錯誤碼:%zd", responses.statusCode);
NSData *data = error.userInfo[AFNetworkingOperationFailingURLResponseDataErrorKey];
if (data) {
id body = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
if ([body isKindOfClass:[NSDictionary class]]) {
NSDictionary *dict = (NSDictionary *)body;
if (dict[@"code"]) {
NSLog(@"錯誤信息:%@", dict[@"errmsg"]);
}
}
}
}
@end
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者