原帖地址:http://blog.youkuaiyun.com/qq_30402119/article/details/49822513
GET请求封装
注意: 先将AFNetworking三方文件拖入工程
这段方法粘在新类的.h文件中
创建新类基于NSObject, 定义需要用到的枚举
#import <Foundation/Foundation.h>
/* 表示返回数据类型 */
typedef NS_ENUM(NSUInteger, responseStyle) {
DATA,
JSON,
XML,
};
/* POST中表示bodyStyle类型 */
typedef NS_ENUM(NSUInteger, bodyStyle) {
stringStyle,
JSONStyle,
};
声明GET和POST两种网络请求方式的类方法
@interface HTTPTOOL : NSObject
/* @param body : 有的GET参数是和url分开的 */
+ (void)GETWithURL:(NSString *)url withBody:(NSDictionary *)body withHttpHead:(NSDictionary *)head responseStyle:(responseStyle)style withSuccess:(void(^)(id result))success withFail:(void(^)(id result))fail;
/* POST网络请求方法声明 */
+ (void)POSTWithURL:(NSString *)url withBody:(id)body withBodyStyle:(bodyStyle)bodyStyle withHttpHead:(NSDictionary *)head responseStyle:(responseStyle)style withSuccess:(void(^)(id result))success withFail:(void(^)(NSError *error))fail;
@end
.m文件中头文件引入
#import "HTTPTOOL.h"
#import "AFNetworking.h" /* 头文件引入, 如果使用cocoapod安装的三方类库使用“<>” */
@implementation HTTPTOOL
GET网络请求方法实现
+ (void)GETWithURL:(NSString *)url withBody:(NSDictionary *)body withHttpHead:(NSDictionary *)head responseStyle:(responseStyle)style withSuccess:(void(^)(id result))success withFail:(void(^)(id result))fail {
NSString *url_string = [NSString stringWithString:url];
/* 创建一个网络请求管理 */
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
/* 添加请求头 */
if (head) {
for (NSString *key in head) {
[manager.requestSerializer setValue:head[key] forHTTPHeaderField:key];
}
}
/* 判断返回数据类型 */
switch (style) {
case DATA: {
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
break;
}
case JSON: {
manager.responseSerializer = [AFJSONResponseSerializer serializer];
break;
}
case XML: {
manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
break;
}
}
/* 设置请求接受的数据类型 */
[manager.responseSerializer setAcceptableContentTypes:[NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html",@"text/plain", nil]];
//本地缓存设置,沙盒路径设置
NSArray *path = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *pathString = path.lastObject;
NSString *pathLast =[NSString stringWithFormat:@"/Caches/com.hackemist.get.default/%lu.text", (unsigned long)[url_string hash]];
//创建字符串文件存储路径
NSString *PathName =[pathString stringByAppendingString:pathLast];
//第一次进入判断有没有文件夹,如果没有就创建一个
NSString * textPath = [pathString stringByAppendingFormat:@"/Caches/com.hackemist.get.default"];
if (![[NSFileManager defaultManager]fileExistsAtPath:textPath]) {
[[NSFileManager defaultManager]createDirectoryAtPath:textPath withIntermediateDirectories:YES attributes:nil error:nil];
}
//设BOOL值 判断解析后的数据是数组还是字典
__block BOOL isClass = NO;
/* get请求 */
[manager GET:url parameters:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nonnull responseObject) {
if ([responseObject isKindOfClass:[NSArray class]]) {
isClass = YES;
} else{
isClass = NO;
}
[responseObject writeToFile:PathName atomically:YES];
success(responseObject);
} failure:^(NSURLSessionDataTask * _Nonnull task, NSError * _Nonnull error) {
NSString * cachePath = PathName;
if ([[NSFileManager defaultManager] fileExistsAtPath:cachePath]) {
//从本地读缓存文件
id responseObject = nil;
if (isClass) {
responseObject = [NSMutableArray arrayWithContentsOfFile:cachePath];
} else {
responseObject = [NSMutableDictionary dictionaryWithContentsOfFile:cachePath];
}
success(responseObject);
}
}];
}
POST请求方法实现
+ (void)POSTWithURL:(NSString *)url withBody:(id)body withBodyStyle:(bodyStyle)bodyStyle withHttpHead:(NSDictionary *)head responseStyle:(responseStyle)style withSuccess:(void (^)(id))success withFail:(void (^)(NSError *))fail {
NSString *url_string = [NSString stringWithString:url];
/* 创建http请求管理者 */
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
/* 处理body类型 */
switch (bodyStyle) {
case stringStyle: {
break;
}
case JSONStyle: {
break;
}
}
/* 添加请求头 */
if (head) {
for (NSString *key in head) {
[manager.requestSerializer setValue:head[key] forHTTPHeaderField:key];
}
}
/* 判断返回数据类型 */
switch (style) {
case DATA: {
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
break;
}
case JSON: {
manager.responseSerializer = [AFJSONResponseSerializer serializer];
break;
}
case XML: {
manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
break;
}
default:
break;
}
/* 设置请求接受的数据类型 */
[manager.responseSerializer setAcceptableContentTypes:[NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html",@"text/plain", nil]];
//本地缓存设置,沙盒路径设置
NSArray *path = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *pathString = path.lastObject;
NSString *pathLast =[NSString stringWithFormat:@"/Caches/com.hackemist.post.default/%lu.text", (unsigned long)[url_string hash]];
//创建字符串文件存储路径
NSString *PathName =[pathString stringByAppendingString:pathLast];
//第一次进入判断有没有文件夹,如果没有就创建一个
NSString * textPath = [pathString stringByAppendingFormat:@"/Caches/com.hackemist.post.default"];
if (![[NSFileManager defaultManager]fileExistsAtPath:textPath]) {
[[NSFileManager defaultManager]createDirectoryAtPath:textPath withIntermediateDirectories:YES attributes:nil error:nil];
}
//设BOOL值 判断解析后的数据是数组还是字典
__block BOOL isClass = NO;
/* POST请求 */
[manager POST:url parameters:body success:^(NSURLSessionDataTask * _Nonnull task, id _Nonnull responseObject) {
if ([responseObject isKindOfClass:[NSArray class]]) {
isClass = YES;
} else{
isClass = NO;
}
[responseObject writeToFile:PathName atomically:YES];
success(responseObject);
} failure:^(NSURLSessionDataTask * _Nonnull task, NSError * _Nonnull error) {
NSString * cachePath = PathName;
if ([[NSFileManager defaultManager] fileExistsAtPath:cachePath]) {
//从本地读缓存文件
id responseObject = nil;
if (isClass) {
responseObject = [NSMutableArray arrayWithContentsOfFile:cachePath];
} else {
responseObject = [NSMutableDictionary dictionaryWithContentsOfFile:cachePath];
}
success(responseObject);
}
}];
}