IOS开发之—— 在AFN基础上进行的网络请求的封装
网络请求的思路:如果请求成功的话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基础上进行的网络请求的封装的更多相关文章
- iOS开发UI篇—Button基础
iOS开发UI篇—Button基础 一.简单说明 一般情况下,点击某个控件后,会做出相应反应的都是按钮 按钮的功能比较多,既能显示文字,又能显示图片,还能随时调整内部图片和文字的位置 二.按钮的三种状 ...
- Delphi for iOS开发指南(1):在Mac上配置你的开发环境
http://cache.baiducontent.com/c?m=9d78d513d99516f11ab7cf690d678c3b584380122ba7a0020fd18438e4732b4050 ...
- iOS开发系列—Objective-C之基础概览
概览 前面我们已经用了几章内容进行C语言介绍,当然要通过几篇文章完整的介绍C语言的知识是不太现实的,例如C语言的文件操作.内存申请等我们都没有重点介绍,当然核心知识点基本都已经提到了,后面有时间我们会 ...
- 李洪强iOS开发之【零基础学习iOS开发】【01-前言】02-准备
在上一讲中,介绍了什么是iOS开发.说简单一点,iOS开发,就是开发运行在iPhone或者iPad上的软件.这么一说完,应该有很多人就会产生一些疑惑,比如学习iOS开发是不是一定要买iPhone?需不 ...
- 李洪强iOS开发之【零基础学习iOS开发】【01-前言】01-开篇
从今天开始,我就开始更新[零基础学习iOS开发]这个专题.不管你是否涉足过IT领域,也不管你是理科生还是文科生,只要你对iOS开发感兴趣,都可以来阅读此专题.我尽量以通俗易懂的语言,让每个人都能够看懂 ...
- 李洪强iOS开发之【零基础学习iOS开发】【02-C语言】02-第一个C语言程序
前言 前面已经唠叨了这么多理论知识,从这讲开始,就要通过接触代码来学习C语言的语法.学习任何一门语言,首先要掌握的肯定是语法.学习C语言语法的目的:就是能够利用C语言编写程序,然后运行程序跟硬件(计算 ...
- 来自IOS开发工程师的零基础自学HTML5经验分享
移动互联网的火爆,而Html具有跨平台.开发快的优势,越来越受到开发者的青睐.感谢IOS开发工程师“小木___Boy”’带来的HTML5学习经验分享. 一.学习途径 1.很多视频网站 比如慕课.和极客 ...
- 李洪强iOS开发之【零基础学习iOS开发【01-前言】03-前景和难易度分析
一.iOS开发的前景 2012年3月份,苹果公司的市值已经突破5000亿美元,成为世界上市值最大的公司.5000亿是神马概念呢? 可以帮助陷入欧债危机的8个国家偿还债务 可以买下35个天安门广场.34 ...
- iOS 开发http post 文件的上传
iOS开发网络篇—文件的上传 说明:文件上传使用的时POST请求,通常把要上传的数据保存在请求体中.本文介绍如何不借助第三方框架实现iOS开发中得文件上传. 由于过程较为复杂,因此本文只贴出部分关键代 ...
随机推荐
- Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)
本篇博客算是一个开头,接下来会持续更新使用Swift3.0开发服务端相关的博客.当然,我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现.Perfect框架是加拿大一个创业团队开发 ...
- ASP.NET Aries 入门开发教程7:DataGrid的行操作(主键操作区)
前言: 抓紧勤奋,再接再励,预计共10篇来结束这个系列. 上一篇介绍:ASP.NET Aries 入门开发教程6:列表数据表格的格式化处理及行内编辑 本篇介绍主键操作区相关内容. 1:什么时候有默认的 ...
- 移动先行之谁主沉浮? 带着你的Net飞奔吧!
移动系源码:https://github.com/dunitian/Windows10 移动系文档:https://github.com/dunitian/LoTDotNet/tree/master/ ...
- SignalR代理对象异常:Uncaught TypeError: Cannot read property 'client' of undefined 推出的结论
异常汇总:http://www.cnblogs.com/dunitian/p/4523006.html#signalR 后台创建了一个DntHub的集线器 前台在调用的时候出现了问题(经检查是代理对象 ...
- 窥探Vue.js 2.0 - Virtual DOM到底是个什么鬼?
引言 你可能听说在Vue.js 2.0已经发布,并且在其中新添加如了一些新功能.其中一个功能就是"Virtual DOM". Virtual DOM是什么 在之前,React和Em ...
- Android权限管理之Android 6.0运行时权限及解决办法
前言: 今天还是围绕着最近面试的一个热门话题Android 6.0权限适配来总结学习,其实Android 6.0权限适配我们公司是在今年5月份才开始做,算是比较晚的吧,不过现在Android 6.0以 ...
- Java中Comparable与Comparator的区别
相同 Comparable和Comparator都是用来实现对象的比较.排序 要想对象比较.排序,都需要实现Comparable或Comparator接口 Comparable和Comparator都 ...
- [自翻]fasthttp中文文档(持续更新)
fasthttp是由valyala编写的声称快于Go官方标准库net/http包十倍的快速HTTP实现.从各方的性能测试结果来看(评测一.评测二),fasthttp作为当下最快的http Go语言包当 ...
- 【原创经验分享】WCF之消息队列
最近都在鼓捣这个WCF,因为看到说WCF比WebService功能要强大许多,另外也看了一些公司的招聘信息,貌似一些中.高级的程序员招聘,都有提及到WCF这一块,所以,自己也关心关心一下,虽然目前工作 ...
- 基于AOP的MVC拦截异常让代码更优美
与asp.net 打交道很多年,如今天微软的优秀框架越来越多,其中微软在基于mvc的思想架构,也推出了自己的一套asp.net mvc 框架,如果你亲身体验过它,会情不自禁的说‘漂亮’.回过头来,‘漂 ...