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

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

作者: 丘昌彬今为蝼蚁 | 来源:发表于2017-01-06 14:26 被阅读962次

    网络请求的思路:如果请求成功的话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基础上进行的网络请求的封装

          本文链接:https://www.haomeiwen.com/subject/ldztbttx.html