AFNetworking是一个常用的网络请求库,每个项目的网络请求和返回格式不同,AFNetworking返回的通用型的,我们可以封装一层,让其更适合我们自己的项目。
实现代码:
#import <Foundation/Foundation.h>
typedef void (^RequestCompleteBlock)(id response);
typedef void (^RequestErrorBlock)(NSError *error);
@interface BZHttpRequestHelper : NSObject
/**
post请求
@param url 接口地址
@param params 入参
@param completeBlock 成功回调
@param errorBlock 失败回调
*/
+(void)postWithUrl:(NSString *)url
params:(NSDictionary *)params
complete:(RequestCompleteBlock)completeBlock
error:(RequestErrorBlock)errorBlock;
/**
get请求
@param url 接口地址
@param params 入参
@param completeBlock 成功回调
@param errorBlock 失败回调
*/
+(void)getWithUrl:(NSString *)url
params:(NSDictionary *)params
complete:(RequestCompleteBlock)completeBlock
error:(RequestErrorBlock)errorBlock;
@end
#import "BZHttpRequestHelper.h"
#import "AFNetworking.h"
//根据服务器返回的格式定义的基础返回模型
#import "BZHttpResponse.h"
//网络状态判断
#import "BZNetworkStatusManager.h"
@implementation BZHttpRequestHelper
+(AFHTTPSessionManager *)shareHttpSessionManager{
static AFHTTPSessionManager * manager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
manager = [AFHTTPSessionManager manager];
manager.requestSerializer = [AFHTTPRequestSerializer serializer];
manager.responseSerializer = [AFJSONResponseSerializer serializer];
manager.requestSerializer.timeoutInterval = 30;
});
return manager;
}
+(void)postWithUrl:(NSString *)url params:(NSDictionary *)params complete:(RequestCompleteBlock)completeBlock error:(RequestErrorBlock)errorBlock{
//判断当前网络状态,如果是无网络状态可直接提示用户,且放弃网络请求
if (![BZNetworkStatusManager shareNetworkStatusManagerInstance].isNetworkAvailable) {
[BZHttpRequestHelper showNetworkUnavailable];
return;
}
[[BZHttpRequestHelper shareHttpSessionManager] POST:url parameters:params progress:^(NSProgress * _Nonnull uploadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
//拿到返回数据后做相应的处理,下面的是根据服务器定义的一些错误码来判断请求是否成功返回
BZHttpResponse * responseModel = [[BZHttpResponse alloc] init];
NSError * error;
if ([responseObject isKindOfClass:[NSDictionary class]]) {
[responseModel setValuesForKeysWithDictionary:responseObject];
if (responseModel.code == 0) {
if (completeBlock) {
if (responseModel.data) {
completeBlock(responseModel.data);
}else{
completeBlock(responseModel);
}
}
}else{
if (responseModel.code == 7) {
//token失效,退出登录
[[NSNotificationCenter defaultCenter] postNotificationName:CURRENT_USER_KICKOUT object:nil];
}else{
error = [NSError errorWithDomain:responseModel.message code:responseModel.code userInfo:nil];
}
if (errorBlock) {
errorBlock(error);
}
}
}else{
error = [NSError errorWithDomain:@"服务器数据结构错误" code:-100 userInfo:nil];
if (errorBlock) {
errorBlock(error);
}
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"error == %@",error);
if (errorBlock) {
errorBlock(error);
}
}];
}
+(void)getWithUrl:(NSString *)url params:(NSDictionary *)params complete:(RequestCompleteBlock)completeBlock error:(RequestErrorBlock)errorBlock{
if (![BZNetworkStatusManager shareNetworkStatusManagerInstance].isNetworkAvailable) {
[BZHttpRequestHelper showNetworkUnavailable];
return;
}
[[BZHttpRequestHelper shareHttpSessionManager] GET:url parameters:params progress:^(NSProgress * _Nonnull downloadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
if (completeBlock) {
completeBlock(responseObject);
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
if (errorBlock) {
errorBlock(error);
}
}];
}
+(void)showNetworkUnavailable{
dispatch_async(dispatch_get_main_queue(), ^{
UIWindow * window = [[[UIApplication sharedApplication] delegate] window];
[window makeToast:@"当前网络不可用,请检查网络稍后再试" duration:1.5 position:CSToastPositionBottom];
});
}
@end
获取当前网络状态:
#import <Foundation/Foundation.h>
@interface BZNetworkStatusManager : NSObject
+(instancetype)shareNetworkStatusManagerInstance;
@property(nonatomic,assign) BOOL isNetworkAvailable;
@end
#import "BZNetworkStatusManager.h"
#import "AFNetworking.h"
@implementation BZNetworkStatusManager
+(instancetype)shareNetworkStatusManagerInstance{
static BZNetworkStatusManager * manager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
manager = [[BZNetworkStatusManager alloc] init];
});
return manager;
}
-(instancetype)init{
self = [super init];
if (self) {
[self monitorNetworking];
}
return self;
}
-(void)monitorNetworking{
[[AFNetworkReachabilityManager sharedManager] startMonitoring];
[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
switch (status) {
case -1:
NSLog(@"未知网络");
break;
case 0:
NSLog(@"网络不可达");
break;
case 1:
NSLog(@"GPRS网络");
break;
case 2:
NSLog(@"wifi网络");
break;
default:
break;
}
if (status == AFNetworkReachabilityStatusReachableViaWWAN || status == AFNetworkReachabilityStatusReachableViaWiFi) {
NSLog(@"有网");
self.isNetworkAvailable = YES;
}else{
NSLog(@"没网");
self.isNetworkAvailable = NO;
}
}];
}
@end