网络请求的思路:如果请求成功的话AFN的responseObject就是解析好的。

1发送网络请求;get/post/或者别的 带上URL,需要传的参数

2判断后台网络状态码有没有请求成功;

3 请求成功:解析数据,刷新页面

4请求失败做处理

VPKCResponse.h

VPKCResponse.m

VPKCRequestManager.h

VPKCRequestManager.m

定义两个文件继承NSObject。

VPKCResponse.h

#import <Foundation/Foundation.h>

typedef 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

#pararmmark

VPKCRequestManager.h

#import <Foundation/Foundation.h>
#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基础上进行的网络请求的封装的更多相关文章

  1. iOS开发UI篇—Button基础

    iOS开发UI篇—Button基础 一.简单说明 一般情况下,点击某个控件后,会做出相应反应的都是按钮 按钮的功能比较多,既能显示文字,又能显示图片,还能随时调整内部图片和文字的位置 二.按钮的三种状 ...

  2. Delphi for iOS开发指南(1):在Mac上配置你的开发环境

    http://cache.baiducontent.com/c?m=9d78d513d99516f11ab7cf690d678c3b584380122ba7a0020fd18438e4732b4050 ...

  3. iOS开发系列—Objective-C之基础概览

    概览 前面我们已经用了几章内容进行C语言介绍,当然要通过几篇文章完整的介绍C语言的知识是不太现实的,例如C语言的文件操作.内存申请等我们都没有重点介绍,当然核心知识点基本都已经提到了,后面有时间我们会 ...

  4. 李洪强iOS开发之【零基础学习iOS开发】【01-前言】02-准备

    在上一讲中,介绍了什么是iOS开发.说简单一点,iOS开发,就是开发运行在iPhone或者iPad上的软件.这么一说完,应该有很多人就会产生一些疑惑,比如学习iOS开发是不是一定要买iPhone?需不 ...

  5. 李洪强iOS开发之【零基础学习iOS开发】【01-前言】01-开篇

    从今天开始,我就开始更新[零基础学习iOS开发]这个专题.不管你是否涉足过IT领域,也不管你是理科生还是文科生,只要你对iOS开发感兴趣,都可以来阅读此专题.我尽量以通俗易懂的语言,让每个人都能够看懂 ...

  6. 李洪强iOS开发之【零基础学习iOS开发】【02-C语言】02-第一个C语言程序

    前言 前面已经唠叨了这么多理论知识,从这讲开始,就要通过接触代码来学习C语言的语法.学习任何一门语言,首先要掌握的肯定是语法.学习C语言语法的目的:就是能够利用C语言编写程序,然后运行程序跟硬件(计算 ...

  7. 来自IOS开发工程师的零基础自学HTML5经验分享

    移动互联网的火爆,而Html具有跨平台.开发快的优势,越来越受到开发者的青睐.感谢IOS开发工程师“小木___Boy”’带来的HTML5学习经验分享. 一.学习途径 1.很多视频网站 比如慕课.和极客 ...

  8. 李洪强iOS开发之【零基础学习iOS开发【01-前言】03-前景和难易度分析

    一.iOS开发的前景 2012年3月份,苹果公司的市值已经突破5000亿美元,成为世界上市值最大的公司.5000亿是神马概念呢? 可以帮助陷入欧债危机的8个国家偿还债务 可以买下35个天安门广场.34 ...

  9. iOS 开发http post 文件的上传

    iOS开发网络篇—文件的上传 说明:文件上传使用的时POST请求,通常把要上传的数据保存在请求体中.本文介绍如何不借助第三方框架实现iOS开发中得文件上传. 由于过程较为复杂,因此本文只贴出部分关键代 ...

随机推荐

  1. Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)

    本篇博客算是一个开头,接下来会持续更新使用Swift3.0开发服务端相关的博客.当然,我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现.Perfect框架是加拿大一个创业团队开发 ...

  2. ASP.NET Aries 入门开发教程7:DataGrid的行操作(主键操作区)

    前言: 抓紧勤奋,再接再励,预计共10篇来结束这个系列. 上一篇介绍:ASP.NET Aries 入门开发教程6:列表数据表格的格式化处理及行内编辑 本篇介绍主键操作区相关内容. 1:什么时候有默认的 ...

  3. 移动先行之谁主沉浮? 带着你的Net飞奔吧!

    移动系源码:https://github.com/dunitian/Windows10 移动系文档:https://github.com/dunitian/LoTDotNet/tree/master/ ...

  4. SignalR代理对象异常:Uncaught TypeError: Cannot read property 'client' of undefined 推出的结论

    异常汇总:http://www.cnblogs.com/dunitian/p/4523006.html#signalR 后台创建了一个DntHub的集线器 前台在调用的时候出现了问题(经检查是代理对象 ...

  5. 窥探Vue.js 2.0 - Virtual DOM到底是个什么鬼?

    引言 你可能听说在Vue.js 2.0已经发布,并且在其中新添加如了一些新功能.其中一个功能就是"Virtual DOM". Virtual DOM是什么 在之前,React和Em ...

  6. Android权限管理之Android 6.0运行时权限及解决办法

    前言: 今天还是围绕着最近面试的一个热门话题Android 6.0权限适配来总结学习,其实Android 6.0权限适配我们公司是在今年5月份才开始做,算是比较晚的吧,不过现在Android 6.0以 ...

  7. Java中Comparable与Comparator的区别

    相同 Comparable和Comparator都是用来实现对象的比较.排序 要想对象比较.排序,都需要实现Comparable或Comparator接口 Comparable和Comparator都 ...

  8. [自翻]fasthttp中文文档(持续更新)

    fasthttp是由valyala编写的声称快于Go官方标准库net/http包十倍的快速HTTP实现.从各方的性能测试结果来看(评测一.评测二),fasthttp作为当下最快的http Go语言包当 ...

  9. 【原创经验分享】WCF之消息队列

    最近都在鼓捣这个WCF,因为看到说WCF比WebService功能要强大许多,另外也看了一些公司的招聘信息,貌似一些中.高级的程序员招聘,都有提及到WCF这一块,所以,自己也关心关心一下,虽然目前工作 ...

  10. 基于AOP的MVC拦截异常让代码更优美

    与asp.net 打交道很多年,如今天微软的优秀框架越来越多,其中微软在基于mvc的思想架构,也推出了自己的一套asp.net mvc 框架,如果你亲身体验过它,会情不自禁的说‘漂亮’.回过头来,‘漂 ...