AFNetworking3.0网络请求方法封装(自带缓存功能)

来源:互联网 发布:阿里云重新安装系统 编辑:程序博客网 时间:2024/06/05 10:34

原帖地址:http://blog.csdn.net/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);        }    }];}
0 0