? ? ? ? 最近這幾個月都在完成一個項目,項目里面用到了太多的數據請求,一開始還是在用以前的那種傳統的請求方式,這樣下來代碼量就顯得太多了,于是就產生了對數據請求進行一個工具類的封裝,這樣省事。經過這幾個月的不斷試驗修改,現在這個工具類已經很成熟了,非常穩定了,今天給大家分享一下,廢話少說了,直接上代碼!
注意:這篇文章有點長,看起來有點復雜,如果您沒有做好看完這篇文章的準備,我建議您還是別再往下看了,以免影響您的心情,不過您要是堅持看到最后,肯定與驚喜!
首先建立一個繼承與NSObject的類命名為:LBRequest
LBRequest.h 文件
//? Created by 蝸牛 on 16/5/23.
//? Copyright ? 2016年
/*
關于蝸牛:一枚九零后碼農
蝸牛-----QQ:3197857495-----李富棚
個人微信:woniu1308822159
微信公眾號:woniuxueios
簡書:蝸牛學IOS? 地址:http://www.lxweimin.com/users/a664a9fcb096/latest_articles
簡書專題:蝸牛學IOS? 地址:http://www.lxweimin.com/collection/bfcf49bf5d27
*/
//. All rights reserved.
//
#import<Foundation/Foundation.h>
//導入AFNetworking頭文件
#import#import "AFNetworking.h"
@class LBResponse;
/**
* @brief 請求參數編碼
*/
typedef enum : NSUInteger{
LBRequestParameterEncodingURL = 0,
LBRequestParameterEncodingURLEncodedInURL,
LBRequestParameterEncodingJSON,
} LBRequestParameterEncoding;
/**?
*@brief接口請求
?*/
@interface LBRequest : NSObject@property (strong,nonatomic) NSString *path;
@property (strong,nonatomic) NSString *method;
@property (assign,nonatomic) LBRequestParameterEncoding encoding;@property (strong,nonatomic) NSDictionary*params;
@property (strong,nonatomic) void(^completion)(LBResponse*);
@end
/// 上傳請求
@interface LBUploadRequest : LBRequest
//文件流
@property (strong,nonatomic) NSData *fileData;
//名字
@property (strong,nonatomic) NSString *name;
//文件名字
@property (strong,nonatomic) NSString *fileName;
//文件類型
@property (strong,nonatomic) NSString *fileType;
//文件地方
@property (nonatomic , strong)NSString * fileModule;
//文件后綴
@property (nonatomic , strong)NSString * fileSuffix;
@end
/**?
*@brief請求響應?
*/
@interface LBResponse : NSObject
@property (strong,nonatomic) LBRequest *request;
@property (assign,nonatomic) NSInteger resultCode;
@property (strong,nonatomic) NSString *message;
@property (assign,nonatomic) BOOL succeed;
/**?
*? Logined表示登錄有效性,值為0表示用戶登錄狀態失效,值為1表示登錄狀態有效。?
*/
@property (assign,nonatomic) BOOL Logged;
@property (strong,nonatomic) id data;
@property (strong,nonatomic) NSDictionary*result;
@end
@interface LBService : NSObject
//檢查返回的數據
+(void)setResponseCheck:(BOOL(^)(LBResponse*))check;
+(void)pause:(LBRequest*)request;
//請求接口
+(void)request:(LBRequest*)request;
//請求接口
+(void)request:(NSString *)path method:(NSString*)method params:(NSDictionary*)params completion:(void(^)(LBResponse*))completion;
//GET請求
+(void)get:(NSString*)path params:(NSDictionary*)params completion:(void(^)(LBResponse* response))completion;
//POST請求
+(void)post:(NSString*)path params:(NSDictionary*)params completion:(void(^)(LBResponse* response))completion;
//上傳請求
+(void)upload:(NSString*)path file:(NSString*)file name:(NSString*)name fileName:(NSString*)fileName fileType:(NSString*)fileType params:(NSDictionary*)params completion:(void(^)(LBResponse* response))completion;
+(void)upload:(NSString*)path file:(NSData*)file name:(NSString*)name params:(NSDictionary*)params completion:(void(^)(LBResponse* response))completion;
//上傳頭像
+(void)uploadFileData:(UIImage *)fileData filePath:(NSString *)path fileSuffix:(NSString *)fileSuffix succeed:(void(^)(NSURLSessionTask *task, id result))succeed failed:(void(^)(NSURLSessionTask *task, NSError *error))failed;
//上傳多張圖片
+ (void)uploadIData:(NSMutableArray *)data path:(NSString*)path imageFileType:(NSString*)fileType fileModule:(NSString*)fileModule fileSuffix:(NSString *)fileSuffix succeed:(void(^)(NSURLSessionTask *task, id result))succeed failed:(void(^)(NSURLSessionTask *task, NSError *error))failed;
@end
LBService.m文件
#import "LBService.h"
@implementation LBRequest
@end
@implementation LBUploadRequest
@end
@implementation LBResponse
@end
@implementation LBService
static BOOL(^__responseCheck)(LBResponse*) = nil;
+(void)setResponseCheck:(BOOL(^)(LBResponse*))check{
__responseCheck = check;
}
+(void)response:(LBRequest*)req json:(NSDictionary*)json{
LBResponse *res = [[LBResponse alloc] init];
res.request = req;
if (json){
res.result = json;
res.message = @"請求成功";
//? ? ? ? res.message = json[@"desc"];
res.succeed=1;
if ([json isKindOfClass:[NSDictionary class]]) {
BOOL isLogined=[json[@"Logined"] intValue];
res.Logined=isLogined;
if ([[json allKeys] containsObject:@"code"]) {
int code = [json[@"code"]intValue];
if (code ==-1) {
res.succeed = 0;
}
if (!res.succeed) {
res.message=json[@"message"];
}
}
}
}else{
res.result = nil;
res.resultCode = 9999;
res.message = @"請求失??!";
res.succeed = NO;
}
if (__responseCheck) {
if (__responseCheck(res)) {
if (req.completion) {
req.completion(res);
}
}
}else{
if (req.completion) {
req.completion(res);
}
}
}
static NSMutableArray *__requestQueue;
//暫停接口的調用
+(void)pause:(LBRequest*)request{? ??
[self request:request ignorePause:YES];? ??
if (__requestQueue == nil) {? ? ? ?
?__requestQueue = [[NSMutableArray alloc] init];? ??
}
}
+(void)request:(LBRequest *)request{? ?
?[self request:request ignorePause:NO];
}
+(void)request:(LBRequest *)request ignorePause:(BOOL)ignorePause{? ?
?if (!ignorePause && __requestQueue) {? ? ? ?
?[__requestQueue addObject:request];?
?? ? ? return;? ??
}? ? static AFHTTPSessionManager *manamer;? ?
?if (manamer == nil) {? ? ? ??
manamer = [AFHTTPSessionManager manager];? ?
?}
//? ? NSString *contentType = @"text/html";
//? ? //參數編碼
// ? ?switch (request.encoding) {
//? ? ? ? case LBRequestParameterEncodingURL:
//? ? ? ? case LBRequestParameterEncodingURLEncodedInURL:
//? ? ? ? ? ? if (![manamer.requestSerializer isKindOfClass:[AFHTTPRequestSerializer class]]) {
//? ? ? ? ? ? ? ? manamer.requestSerializer = [AFHTTPRequestSerializer serializer];
//? ? ? ? ? ? ? ? contentType = @"text/html";
//? ? ? ? ? ? }
//? ? ? ? ? ? break;
//? ? ? ? case LBRequestParameterEncodingJSON:
//? ? ? ? ? ? if (![manamer.requestSerializer isKindOfClass:[AFJSONRequestSerializer class]]) {
//? ? ? ? ? ? ? ? manamer.requestSerializer = [AFJSONRequestSerializer serializer];
//? ? ? ? ? ? ? ? contentType = @"application/json";
//? ? ? ? ? ? }
//? ? ? ? ? ? break;
//? ? ? ? default:
//? ? ? ? ? ? break;
//? ? }
//? ??
//加上charset
//? ? NSString *charset = (__bridge NSString *)CFStringConvertEncodingToIANACharSetName(CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding));
//? ? [manamer.requestSerializer setValue:[NSString stringWithFormat:@"%@; charset=%@", contentType,charset] forHTTPHeaderField:@"Content-Type"];
//? ??
//? ? AFJSONResponseSerializer *resSer = [AFJSONResponseSerializer serializer];
//? ? resSer.readingOptions = NSJSONReadingMutableContainers;
//? ? resSer.acceptableContentTypes = [NSSet setWithObjects:@"text/html", nil];? ? ? ? manamer.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html", @"text/plain",nil];? ? ? ??
//? ? manamer.responseSerializer = resSer;? ??
//請求成功? ??
void(^success)(NSURLSessionDataTask *,id) = ^(NSURLSessionDataTask *task, id responseObject){? ? ? ? NSLog(@"\n收到響應:%zd\n%@\n%@",((NSHTTPURLResponse*)task.response).statusCode,request.path,responseObject);? ? ? ? [self response:request json:responseObject];? ??
};? ??
//請求失敗? ??
void(^failure)(NSURLSessionDataTask *, NSError *) = ^(NSURLSessionDataTask *task, NSError *error){? ? ? ? NSLog(@"\n收到失敗的響應:%@\n結果:%zd",error.localizedDescription,((NSHTTPURLResponse*)task.response).statusCode);? ? ? ??
[self response:request json:nil];? ?
?};? ?
?NSLog(@"\n開始請求:\nURL:\t%@\nMethod:\t%@\nParams:\t%@",request.path,request.method,request.params);? ??
if ([request isKindOfClass:[LBUploadRequest class]]) {? ? ? ??
LBUploadRequest *uploadReqeust = (LBUploadRequest*)request;? ? ? ??
[manamer POST:request.path parameters:request.params constructingBodyWithBlock:^(id_Nonnull formData) {
if (uploadReqeust.fileType) {
[formData appendPartWithFileData:uploadReqeust.fileData name:uploadReqeust.name fileName:uploadReqeust.fileName mimeType:uploadReqeust.fileType];
}else{
[formData appendPartWithFormData:uploadReqeust.fileData name:uploadReqeust.name];
}
} progress:nil success:success failure:failure];
}else{
//根據POST,GET動態調用manager下對應的方法
NSString *method = [request.method uppercaseString];
if ([method isEqualToString:@"POST"]) {
[manamer POST:request.path parameters:request.params progress:nil success:success failure:failure];
}else if([method isEqualToString:@"PUT"]){
[manamer PUT:request.path parameters:request.params success:success failure:failure];
}else if([method isEqualToString:@"DELETE"]){
[manamer DELETE:request.path parameters:request.params success:success failure:failure];
}else{
[manamer GET:request.path parameters:request.params progress:nil success:success failure:failure];
}
}
}
+(void)request:(NSString *)path method:(NSString *)method params:(NSDictionary*)params completion:(void (^)(LBResponse *))completion{? ?
?LBRequest *request = [[LBRequest alloc] init];? ?
?request.path = path;? ?
?request.method = method;? ??
request.encoding = LBRequestParameterEncodingJSON;? ?
?request.params = params;? ?
?request.completion = completion;? ?
?[self request:request];
}
+(void)get:(NSString *)path params:(NSDictionary*)params completion:(void (^)(LBResponse *))completion{? ??
LBRequest *request = [[LBRequest alloc] init];? ?
?request.path = path;? ?
?request.method = @"GET";? ?
?request.encoding = LBRequestParameterEncodingJSON;? ?
?request.params = params;? ? ? ?
?request.completion = completion;? ??
[self request:request];
}
+(void)post:(NSString *)path params:(NSDictionary*)params completion:(void (^)(LBResponse *))completion{? ?
?LBRequest *request = [[LBRequest alloc] init];? ??
request.path = path;? ?
?request.method = @"POST";? ??
request.encoding = LBRequestParameterEncodingJSON;? ?
?request.params = params;? ??
request.completion = completion;??
? [self request:request];
}
// 上傳請求
+(void)upload:(NSString*)path file:(NSString*)file name:(NSString*)name fileName:(NSString*)fileName fileType:(NSString*)fileType params:(NSDictionary*)params completion:(void(^)(LBResponse* response))completion{? ?
?LBUploadRequest *request = [[LBUploadRequest alloc] init];? ??
request.path = path;? ?
?request.fileData = file;? ??
request.name = name;? ??
request.fileName = fileName;? ??
request.fileType = fileType;? ?
?request.method = @"POST";? ??
request.encoding = LBRequestParameterEncodingJSON;? ?
?request.params = params;? ??
request.completion = completion;? ??
[self request:request];
}
+(void)upload:(NSString *)path file:(NSData *)file name:(NSString *)name params:(NSDictionary*)params completion:(void (^)(LBResponse *))completion{? ?
?LBUploadRequest *request = [[LBUploadRequest alloc] init];??
? request.path = path;? ?
?request.fileData = file;? ?
?request.name = name;? ?
?request.fileName = nil;? ?
?request.fileType = nil;? ??
request.method = @"POST";? ??
request.encoding = LBRequestParameterEncodingJSON;? ??
request.params = params;? ?
?request.completion = completion;? ??
[self request:request];
}
@end
創建FRBaseHttpManage繼承與NSObject
FRBaseHttpManage.h文件
#import<Foundation/Foundation.h>
#import#import "LBService.h"
@interface FRBaseHttpManage : NSObject
@property(nonatomic,strong)NSMutableDictionary *parameters;
@property(nonatomic,copy)NSString *requestUrl;
@end
FRBaseHttpManage.m文件
#import "FRBaseHttpManage.h"
@implementation FRBaseHttpManage
- (instancetype)init
{
self = [super init];
if (self) {
_requestUrl=@"";
_parameters=[NSMutableDictionary dictionary];
}
return self;
}
@end
到這里為止,工具類基本上建好了,下面就是如何使用了
建立FRHomeManage繼承FRBaseHttpManage
FRBaseHttpManage.h文件
#import "FRBaseHttpManage.h"
typedef enum : NSUInteger{
ISHomeTypeFocusBrand,
} ISSettingType;
@interface FRHomeManage : FRBaseHttpManage
//定義一個對外的方法
//把要傳的參數寫在方法里面
-(void)home:(ISSettingType)type PageNumber:(int)pageNumber PageSize:(int)pageSize completion:(void (^)(NSDictionary *,LBResponse *))completion;
@end
FRBaseHttpManage.m文件
#import "FRHomeManage.h"
@implementation FRHomeManage
//實現這個方法
-(void)home:(ISSettingType)type PageNumber:(int)pageNumber PageSize:(int)pageSize completion:(void (^)(NSDictionary *, LBResponse *))completion{
self.parameters=[NSMutableDictionary dictionary];
switch (type) {//判斷類型
case ISHomeTypeFocusBrand:
{//以下為要傳的參數,根據各自的需求傳參
self.requestUrl=FRURL_String(FocusBrandURL);//請求的url
if (app.user.Id) self.parameters[@"memberId"]=app.user.Id;
self.parameters[@"pageNumber"]=@(pageNumber);
self.parameters[@"pageSize"]=@(pageSize);
}
break;
default:
break;
}
//這里分了為get和post請求
[LBService get:self.requestUrl params:self.parameters completion:^(LBResponse *response){
if (response.succeed) {
switch (type) {
case ISHomeTypeFocusBrand:
{
NSLog(@"關注品牌:%@",response.result);//請求成功了打印數據
completion(response.result,response);
}
break;
default:
break;
}
}else completion(nil,response);
}];
}
在控制器里實現這個方法
-(void)requestFocusData{
WEAKSELF;
[weakSelf addHUD:@"正在加載數據..."];
FRHomeManage *manage=[[FRHomeManage alloc]init];
[manage home:ISHomeTypeFocusBrand PageNumber:1 PageSize:100 completion:^(NSDictionary *array, LBResponse *response){
[weakSelf.HUD hide:YES];
if (response.succeed) {//判斷是否請求成功,返回的是json類型
_focusArray=[array objectForKey:@"data"];
[_collectionView reloadData];
[weakSelf addHUD:[array objectForKey:@"message"]];
}else{
[weakSelf addHUD:[array objectForKey:@"message"]];
}
}];
}
到這里,基本上就把請求工具類的封裝使用介紹完畢了,如果看不懂,可以聯系我要源碼!