IOS开发之—— 在AFN基础上进行的网络请求的封装

网络请求的思路:如果请求成功的话AFN的responseObject就是解析好的。1发送网络请求;get/post/或者别的 带上URL,需要传的参数2判断后台网络状态码有没有请求成功;3 请求成功:解析数据,刷新页面4请求失败做处理VPKCResponse.hVPKCResponse.mVPKCRequestManager.hVPKCRequestManager.m定义两个文件继承NSObject。VPKCResponse.h#importtypedef NS_ENUM(NSInteger, VPKCHttpStatusCode) {        /// 业务正常处理    VPKCStatusCode_OK = 200,        /// 袋鼠家业务错误,返回错误码和错误信息    VPKCStatusCode_Accepted = 202,        /// 上行参数不符合定义,比较必须参数、json格式、数据类型等    VPKCStatusCode_BadRequest = 400,        /// 权限不够,hmac问题    VPKCStatusCode_Unauthorized = 401,        /// 请求的uri不符合协议规定,在服务器无法找到对应的处理器    VPKCStatusCode_NotFound = 404,        /// 服务器异常    VPKCStatusCode_InternalServerError = 500,        /// 接口对应的服务未部署    VPKCStatusCode_BadGateway = 502,};@interface VPKCResponse : NSObject/// 请求返回 responseObject@property(copy, nonatomic) id responseObject;///// 请求头信息@property (copy, nonatomic) id headerFields;///// AFNetworking返回错误信息@property(strong, nonatomic) NSError *error;///////// 服务器状态码@property (strong, nonatomic) NSNumber *status;///// 202状态错误码@property (strong, nonatomic) NSNumber *errorCode;/////// 202状态错误描述信息@property (copy, nonatomic) NSString *errorDescription;/////// 弹框显示内容@property (nonatomic, copy) NSString *content;@end#pararmmarkVPKCRequestManager.h#import#import "VPKCResponse.h"

@interface VPKCRequestManager : NSObject

/// 获取当前网络是否可用

@property (assign, nonatomic, readonly) BOOL reachable;

/// 单利

+ (VPKCRequestManager *)sharedRequest;

/// 取消当前请求任务

- (void)cancelCurrentTask;

/// 取消所有请求任务

- (void)cancelAllTask;

/// GET

+ (VPKCRequestManager *)GET:(NSString *)url

withParame:(NSDictionary *)parame

withComplete:(void(^)(VPKCResponse *responseObj))result;

/// POST

+ (VPKCRequestManager *)POST:(NSString *)url

withParame:(NSDictionary *)parame

withComplete:(void(^)(VPKCResponse *responseObj))result;

/// PUT

+ (VPKCRequestManager *)PUT:(NSString *)url

withParame:(NSDictionary *)parame

withComplete:(void(^)(VPKCResponse *responseObj))result;

/// PATCH

+ (VPKCRequestManager *)PATCH:(NSString *)url

withParame:(NSDictionary *)parame

withComplete:(void(^)(VPKCResponse *responseObj))result;

/// DELETE

+ (VPKCRequestManager *)DELETE:(NSString *)url

withParame:(NSDictionary *)parame

withComplete:(void(^)(VPKCResponse *responseObj))result;

@end

VPKCRequestManager.m

#import "VPKCRequestManager.h"

#import "VPKCUtils.h"

#import "AFNetworkActivityIndicatorManager.h"

#import "AFNetworking.h"

typedef NS_ENUM(NSInteger , VPKCRequestMethod) {

VPKCRequestMethodGet,

VPKCRequestMethodPost,

VPKCRequestMethodPut,

VPKCRequestMethodDelete,

VPKCRequestMethodPatch,

VPKCRequestMethodHead,

};

const NSString *methodStirng[] = {

[VPKCRequestMethodGet] = @"GET",

[VPKCRequestMethodPost] = @"POST",

[VPKCRequestMethodHead] = @"HEAD",

[VPKCRequestMethodPut] = @"PUT",

[VPKCRequestMethodDelete] = @"DELETE",

[VPKCRequestMethodPatch] = @"PATCH",

};

@interface VPKCRequestManager ()

@property (strong, nonatomic) AFHTTPSessionManager *sessionManager;

@property (strong, nonatomic) NSURLSessionDataTask *sessionDataTask;

/// 网络是否可用

@property (assign, nonatomic, readwrite) BOOL reachable;

//

/// 当前任务ID

@property (assign, nonatomic) NSInteger taskIdentifier;

//

//

//

/// 请求地址(前半段)

@property (strong, nonatomic) NSString *requestBaseUrl;

// 请求地址(后半段)

@property (copy, nonatomic) NSString *requestApiUrl;

/// 请求参数

@property (strong, nonatomic) NSDictionary *requestParame;

/// 请求方式

@property (assign, nonatomic) VPKCRequestMethod requestMethod;

@end

@implementation VPKCRequestManager

#pragma mark ---------------------------------------------------------------

/// GET

+ (VPKCRequestManager *)GET:(NSString *)url

withParame:(NSDictionary *)parame

withComplete:(void(^)(VPKCResponse *responseObj))result {

return [self requestConfigWithUrl:url withParame:parame withMethod:VPKCRequestMethodGet withComplete:result];

}

/// POST

+ (VPKCRequestManager *)POST:(NSString *)url

withParame:(NSDictionary *)parame

withComplete:(void(^)(VPKCResponse *responseObj))result {

return [self requestConfigWithUrl:url withParame:parame withMethod:VPKCRequestMethodPost withComplete:result];

}

/// PUT

+ (VPKCRequestManager *)PUT:(NSString *)url

withParame:(NSDictionary *)parame

withComplete:(void(^)(VPKCResponse *responseObj))result {

return [self requestConfigWithUrl:url withParame:parame withMethod:VPKCRequestMethodPut withComplete:result];

}

/// PATCH

+ (VPKCRequestManager *)PATCH:(NSString *)url

withParame:(NSDictionary *)parame

withComplete:(void(^)(VPKCResponse *responseObj))result {

return [self requestConfigWithUrl:url withParame:parame withMethod:VPKCRequestMethodPatch withComplete:result];

}

/// DELETE

+ (VPKCRequestManager *)DELETE:(NSString *)url

withParame:(NSDictionary *)parame

withComplete:(void(^)(VPKCResponse *responseObj))result {

return [self requestConfigWithUrl:url withParame:parame withMethod:VPKCRequestMethodDelete withComplete:result];

}

/// 取消当前请求任务

- (void)cancelCurrentTask {

// cancel specific task

for (NSURLSessionDataTask* task in [_sessionManager tasks]) {

if (task.taskIdentifier == _taskIdentifier) {

[task cancel];

}

}

}

/// 取消所有请求任务

- (void)cancelAllTask {

[_sessionDataTask cancel];

}

+ (VPKCRequestManager *)sharedRequest {

static VPKCRequestManager *requestManage;

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

requestManage = [[self alloc] initPrivate];

});

return requestManage;

}

- (instancetype)initPrivate {

if (self = [super init]) {

_reachable = YES;

_requestBaseUrl = [NSURL URLWithString:@"http://baidu.com"];

_requestMethod = VPKCRequestMethodGet;

_sessionManager = [AFHTTPSessionManager manager];

_sessionManager.requestSerializer = [AFJSONRequestSerializer serializer];

_sessionManager.responseSerializer = [AFJSONResponseSerializer serializer];

_sessionManager.requestSerializer.timeoutInterval = 30;

_sessionManager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html",@"application/json",@"text/plain", nil];

[_sessionManager setSecurityPolicy:[self customSecurityPolicy]];

[[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES];

[_sessionManager.reachabilityManager startMonitoring];

__weak typeof(self)weakSelf = self;

[_sessionManager.reachabilityManager setReachabilityStatusChangeBlock:^void(AFNetworkReachabilityStatus status)

{

weakSelf.reachable = [@(status) boolValue];

}];

}

return self;

}

//// 设置请求头

- (void)setHmacStringWithSessionManager:(AFHTTPRequestSerializer *)requestSerializer {

//    NSString *time = [VPKCUtils timeToTurnTheTimestamp];

//    NSString *hmac = [NSString stringWithFormat:@"%@\n%@/%@\n%@",time,kHmacUrl,_requestApiUrl,methodStirng[_requestMethod]];

//    hmac = [NSString hmac:hmac];

//    NSString *devID = [VPKCUserInfo sharedUserInfo].parentDeviceId;

//    NSString *user = [VPKCUserInfo sharedUserInfo].username;

//    NSString *child = [VPKCUserInfo sharedUserInfo].childDeviceId?:@"";

//

//    [requestSerializer setValue:time forHTTPHeaderField:@"X-KC-TIME"];

//    [requestSerializer setValue:hmac forHTTPHeaderField:@"X-KC-HMAC"];

//    [requestSerializer setValue:devID forHTTPHeaderField:@"X-KC-DEVICEID"];

//    [requestSerializer setValue:user forHTTPHeaderField:@"X-KC-USERNAME"];

//    [requestSerializer setValue:child forHTTPHeaderField:@"X-KC-CHILD-DEVICEID"];

}

// https配置

- (AFSecurityPolicy*)customSecurityPolicy {

NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"d" ofType:@"cer"];

NSData *certData = [NSData dataWithContentsOfFile:cerPath];

AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];

[securityPolicy setAllowInvalidCertificates:NO];

[securityPolicy setPinnedCertificates:@[certData]];

return securityPolicy;

}

//

/// 拼接url

- (NSString *)requestServiceUrlString {

if ([_requestApiUrl hasPrefix:@"http"]) {

return _requestApiUrl;

}

return [NSString stringWithFormat:@"%@/%@",_requestBaseUrl,_requestApiUrl];

}

#pragma mark ------------------------------------------------------------

- (void)requestStartWithWithSuccess:(void (^)(VPKCResponse *))result {

[self requestMethodWithSuccess:^(NSURLSessionDataTask *task, id responseObject) {

NSLog(@"【request_responseObject】=%@ == %@",responseObject,task.response.URL.absoluteString);

VPKCResponse *response = [[VPKCResponse alloc] init];

response.responseObject = responseObject;

response.error = nil;

if ([task.response isKindOfClass:[NSHTTPURLResponse class]]) {

NSHTTPURLResponse *r = (NSHTTPURLResponse *)task.response;

response.headerFields = r.allHeaderFields;

response.status = @(r.statusCode);

}

if (result) {

result(response);

}

} failure:^(NSURLSessionDataTask *task, NSError *error) {

NSLog(@"【request_error】=%@  == Url = %@",error,task.response.URL.absoluteString);

VPKCResponse *response = [[VPKCResponse alloc] init];

response.error = error;

if ([task.response isKindOfClass:[NSHTTPURLResponse class]]) {

NSHTTPURLResponse *r = (NSHTTPURLResponse *)task.response;

response.headerFields = r.allHeaderFields;

response.status = @(r.statusCode);

if ([response.status isEqualToNumber:@403]) {

NSData *data = error.userInfo[AFNetworkingOperationFailingURLResponseDataErrorKey];

if (data) {

NSString *s = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

NSDictionary *responseObject = [VPKCUtils jsonWithString:s];

NSLog(@"error = %@",responseObject);

response.content = responseObject[@"content"];

response.errorCode = responseObject[@"errorCode"];

response.errorDescription = responseObject[@"errorDescription"];

}

}

if ([response.status isEqualToNumber:@502]) {

UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"连接服务器异常" message:nil delegate:self cancelButtonTitle:nil otherButtonTitles:nil, nil];

[alertView show];

}

}

if (result) {

result(response);

}

}];

}

- (void)requestMethodWithSuccess:(void(^)(NSURLSessionDataTask *task, id responseObject))success failure:(void(^)(NSURLSessionDataTask * task, NSError * error))failure {

if (!_reachable) {

failure(nil,[NSError errorWithDomain:@"网络连接失败" code:-1 userInfo:nil]);

return ;

}

NSDictionary *parame = _requestParame;

NSString *URLString = [self requestServiceUrlString];

[self setHmacStringWithSessionManager:_sessionManager.requestSerializer];

NSLog(@"【URL】%@",URLString);

NSLog(@"【parame】%@",parame);

switch (_requestMethod)

{

case VPKCRequestMethodGet:

_sessionDataTask = [_sessionManager GET:URLString parameters:parame success:success failure:failure];

break;

case VPKCRequestMethodPost:

_sessionDataTask = [_sessionManager POST:URLString parameters:parame success:success failure:failure];

break;

case VPKCRequestMethodPut:

_sessionDataTask =  [_sessionManager PUT:URLString parameters:parame success:success failure:failure];

break;

case VPKCRequestMethodDelete:

_sessionDataTask =  [_sessionManager DELETE:URLString parameters:parame success:success failure:failure];

break;

case VPKCRequestMethodPatch:

_sessionDataTask =  [_sessionManager PATCH:URLString parameters:parame success:success failure:failure];

break;

case VPKCRequestMethodHead:{

_sessionDataTask = [_sessionManager HEAD:URLString parameters:parame success:^(NSURLSessionDataTask * task) {

success(task,nil);

} failure:failure];

}

break;

default:

break;

}

_taskIdentifier = _sessionDataTask.taskIdentifier;

}

+ (VPKCRequestManager *)requestConfigWithUrl:(NSString *)url

withParame:(NSDictionary *)parame

withMethod:(VPKCRequestMethod)method

withComplete:(void(^)(VPKCResponse *responseObj))result

{

VPKCRequestManager *request = [VPKCRequestManager sharedRequest];

request.requestApiUrl = url;

request.requestParame = parame;

request.requestMethod = method;

[request requestStartWithWithSuccess:result];

return request;

}

@end

在VPKCUtils文件中 ——————/** 辅助工具类,根据需求进行添加 */

/**

*  将字符串转化为字典

*

*  @param string JSON字符串

*

*  @return 字典

*/

+ (NSDictionary *)jsonWithString:(NSString *)string;

+ (NSDictionary *)jsonWithString:(NSString *)string {

if (!string) {

return nil;

}

NSData *jsonData = [string dataUsingEncoding:NSUTF8StringEncoding];

NSError *err;

NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&err];

if (err) {

return nil;

}

return dic;

}

你可能感兴趣的:(IOS开发之—— 在AFN基础上进行的网络请求的封装)