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

本文介绍如何使用AFNetworking库封装GET和POST网络请求方法,包括处理不同响应类型(如JSON、XML等),设置请求头,以及缓存机制。同时提供了具体的实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原帖地址: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);
        }
    }];
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值