基于AFNetWorking3.0的简单封装

网络请求基本是每个项目都会用到的,所有,做一个简单封装的网络工具类还是很有必要的,因为iOS 9已经放弃了NSURLConnection的支持,而且要求以后的app都必须支持IPV6,所以,一下的网络工具类是基于AFNetWorking 3.0和NSURLSession封装的。废话不多说了,简单的工具类,就直接上代码吧!

.h文件

//  HttpsAssist.h

//  testApp

//

//  Created by Phoenix on 2017/1/16.

//  Copyright © 2017 Rock.test. All rights reserved.

//


#import <Foundation/Foundation.h>

#import <AFNetworking.h> //AF 3.x版本


#define BASE_URL @"http://xxx.xx.xx.174:80/AppFrameWork"


#pragma mark 网络请求类型

enum HTTPMETHOD{

    METHOD_GET   = 0,   //GET请求

    METHOD_POST  = 1,   //POST请求

};


@interface HttpsAssist : NSObject

/**

 *  类方法

*/

+ (AFHTTPSessionManager *)sharedUtil;


/**

* iOS自带网络请求框架

*/

+ (void)requestURL:(NSString *)urlstring

        httpMethod:(NSString *)method

            params:(NSMutableDictionary *)params

       complection:(void(^)(id result))block;


/**

* AF数据请求

*/

+(void)requestAFURL:(NSString *)URLString

          httpMethod:(NSInteger)method

          parameters:(id)parameters

             succeed:(void (^)(id))succeed

             failure:(void (^)(NSError *))failure;



/**

* 上传单张图片

*/

+(void)requestAFURL:(NSString *)URLString

         parameters:(id)parameters

          imageData:(NSData *)imageData

            succeed:(void (^)(id))succeed

            failure:(void (^)(NSError *))failure;



/**

* 上传多张图片

*/

+(void)requestAFURL:(NSString *)URLString

          parameters:(id)parameters

      imageDataArray:(NSArray *)imageDataArray

         succeed:(void (^)(id))succeed

         failure:(void (^)(NSError *))failure;


/**

* 上传文件

*/

+(void)requestAFURL:(NSString *)URLString

          parameters:(id)parameters

            fileData:(NSData *)fileData

             succeed:(void (^)(id))succeed

             failure:(void (^)(NSError *))failure;


/*json

* @brief 把格式化的JSON格式的字符串转换成字典

* @param jsonString JSON格式的字符串

* @return 返回字典

*/

+ (NSDictionary *)dictionaryWithJsonString:(NSString *)jsonString;



/*json

* @brief 把字典转换成字符串

* @param jsonString JSON格式的字符串

* @return 返回字符串

*/

+(NSString*)URLEncryOrDecryString:(NSDictionary *)paramDict IsHead:(BOOL)_type;   


@end








.m文件

//  HttpsAssist.m

//  testApp

//

//  Created by Phoenix on 2017/1/16.

//  Copyright © 2017 Rock.test. All rights reserved.

//


#import "HttpsAssist.h"

@implementation HttpsAssist

// 类方法

+ (AFHTTPSessionManager *)sharedUtil{

    static AFHTTPSessionManager *manager =nil;

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        manager = [AFHTTPSessionManager manager];

    });

    return manager;

}


/**

 *iOS自带网络请求框架

 */

+ (void)requestURL:(NSString *)urlstring

        httpMethod:(NSString *)method

            params:(NSMutableDictionary *)params

       complection:(void(^)(id result))block{

    

// 1、构造URL

    urlstring = [BASE_URL stringByAppendingString:urlstring];

    NSURL *url = [NSURL URLWithString:urlstring];

    

// 2、构造request

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

    [request setTimeoutInterval:60];

    [request setHTTPMethod:method];

    //1>拼接请求参数:username=wxhl&password=123456&key=value&....

    NSMutableString *paramsString = [NSMutableString string];

    NSArray *allkeys = params.allKeys;

    for (int i =0; i<params.count; i++) {

        NSString *key =allkeys[i];

        NSString *value = params[key];

        [paramsString appendFormat:@"%@=%@",key,value];

        if (i<params.count-1) {

            [paramsString appendFormat:@"&"];

        }

    }

    

    // get请求

    if ([method isEqualToString:@"GET"]) {

        NSString *separe = url.query?@"&":@"?";

        NSString *paramsURL = [NSString stringWithFormat:@"%@%@%@",urlstring,separe,paramsString];

        request.URL = [NSURL URLWithString:paramsURL];

    }

    // post请求

    if ([method isEqualToString:@"POST"]) {

        NSData *bodyData = [paramsString dataUsingEncoding:NSUTF8StringEncoding];

        [request setHTTPBody:bodyData];

    }

    

// 3、构造连接对象

    NSURLSession *session = [NSURLSession sharedSession];

    NSURLSessionTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData *_Nullable data, NSURLResponse *_Nullable response, NSError *_Nullable error) {

        

        if (error) {

            NSLog(@"网络请求失败:%@",error.localizedDescription);

            return ;

        }

        // 1.解析JSON  ---->字典、数组

        id result = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];

        block(result);

        

    }];

    

    [task resume];

    

}


/**

 * AFNetWorking网络请求

 */

+(void)requestAFURL:(NSString *)URLString

         httpMethod:(NSInteger)method

         parameters:(id)parameters

            succeed:(void (^)(id))succeed

            failure:(void (^)(NSError *))failure{

    //1. 设置API地址

    URLString = [NSString stringWithFormat:@"%@%@",BASE_URL,[URLString stringByReplacingOccurrencesOfString:@" " withString:@"%20"]];

    NSLog(@"\n AF网络请求参数列表:%@\n\n接口名: %@\n\n",parameters,URLString);

    

    //2.创建请求管理者

    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

    

    //3.申明返回的结果是二进制类型

    manager.responseSerializer = [AFHTTPResponseSerializer serializer];

    

    //4.如果报接受类型不一致请替换一致text/html或者text/plain

    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json",@"text/json",@"text/javascript",@"text/html",@"text/plain",nil];

    

    //5.请求超时,时间设置

    manager.requestSerializer.timeoutInterval = 30;

    

    //6.选择请求方式

    switch (method) {

        case METHOD_GET:

        {

            [manager GET:URLString parameters:nil progress:nil success:^(NSURLSessionDataTask *_Nonnull task, id _Nullable responseObject) {

                NSString *responseStr = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];

                succeed([HttpsAssist dictionaryWithJsonString:responseStr]);

                NSLog(@"\n 网络请求成功:%@\n\n",[HttpsAssist dictionaryWithJsonString:responseStr]);

            } failure:^(NSURLSessionDataTask * _Nullable task, NSError *_Nonnull error) {

                failure(error);

                NSLog(@"网络请求失败:%@",error.localizedDescription);

            }];

        }

            break;

        case METHOD_POST:

        {

            [manager POST:URLString parameters:parameters progress:nil success:^(NSURLSessionDataTask *_Nonnull task,id _Nullable responseObject) {

                NSString *responseStr = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];

                succeed([HttpsAssist dictionaryWithJsonString:responseStr]);

                NSLog(@"\n 网络请求成功:%@\n\n",[HttpsAssist dictionaryWithJsonString:responseStr]);

            } failure:^(NSURLSessionDataTask * _Nullable task, NSError *_Nonnull error) {

                failure(error);

                NSLog(@"网络请求失败:%@",error.localizedDescription);

            }];

        }

            break;

        default:

            break;

    }

}


/**

 * 上传单张图片

 */

+(void)requestAFURL:(NSString *)URLString

         parameters:(id)parameters

          imageData:(NSData *)imageData

            succeed:(void (^)(id))succeed

            failure:(void (^)(NSError *))failure{

    // 1.设置API地址

    URLString = [NSString stringWithFormat:@"%@%@",BASE_URL,[URLString stringByReplacingOccurrencesOfString:@" " withString:@"%20"]];

    

    // 2.创建请求管理者

    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

    

    // 3.什么返回的结果是二进制类型

    manager.responseSerializer = [AFHTTPResponseSerializer serializer];

    

    // 4.如果报接受类型不一致请替换一致text/html或者text/plain

    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json",@"text/json",@"text/javascript",@"text/html",@"text/plain",nil];

    

    // 5.请求超时

    manager.requestSerializer.timeoutInterval = 30;

    

    // 6.POST数据

    [manager POST:URLString parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {

        // 在网络开发中,上传文件时,是不允许文件被覆盖,文件重名的,要解决此问题,可以在上传时使用当前的系统事件作为文件名

        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];

        formatter.dateFormat = @"yyyyMMddHHmmss";

        NSString *str = [formatter stringFromDate:[NSDate date]];

        NSString *fileName = [NSString stringWithFormat:@"%@.png",str];

        // 将得到的二进制图片拼接到表单中 /**data,指定上传的二进制流;服务器所需参数名*/

        [formData appendPartWithFileData:imageData name:@"file" fileName:fileName mimeType:@"image/png"];

        

    } progress:nil success:^(NSURLSessionDataTask *_Nonnull task,id _Nullable responseObject) {

        NSString *responseStr = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];

        succeed([HttpsAssist dictionaryWithJsonString:responseStr]);

        NSLog(@"上传图片成功");

    } failure:^(NSURLSessionDataTask * _Nullable task, NSError *_Nonnull error) {

        failure(error);

        NSLog(@"上传图片失败:%@",error.localizedDescription);

    }];

}


/**

 * 上传多张图片

 */

+(void)requestAFURL:(NSString *)URLString

         parameters:(id)parameters

     imageDataArray:(NSArray *)imageDataArray

            succeed:(void (^)(id))succeed

            failure:(void (^)(NSError *))failure{

    // 1.设置API地址

    URLString = [NSString stringWithFormat:@"%@%@",BASE_URL,[URLString stringByReplacingOccurrencesOfString:@" " withString:@"%20"]];

    

    // 2.创建请求管理者

    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

    

    // 3.什么返回的结果是二进制类型

    manager.responseSerializer = [AFHTTPResponseSerializer serializer];

    

    // 4.如果报接受类型不一致请替换一致text/html或者text/plain

    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json",@"text/json",@"text/javascript",@"text/html",@"text/plain",nil];

    

    // 5.请求超时

    manager.requestSerializer.timeoutInterval = 30;

    

    // 6.POST数据

    [manager POST:URLString parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {

        for (int i =0; i<imageDataArray.count; i++) {

            NSData *imageData = imageDataArray[i];

           //在网络开发中,上传文件时,是不允许文件被覆盖,文件重名的,要解决此问题,可以在上传时使用当前的系统事件作为文件名

            NSDateFormatter *formatter = [[NSDateFormatter alloc] init];

            formatter.dateFormat = @"yyyyMMddHHmmss";

            NSString *str = [formatter stringFromDate:[NSDate date]];

            NSString *fileName = [NSString stringWithFormat:@"%@.png",str];

           //将得到的二进制图片拼接到表单中 /**data,指定上传的二进制流;服务器所需参数名*/

            [formData appendPartWithFileData:imageData name:@"file" fileName:fileName mimeType:@"image/png"];

        }

    } progress:nil success:^(NSURLSessionDataTask *_Nonnull task,id _Nullable responseObject) {

        NSString *responseStr = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];

        succeed([HttpsAssist dictionaryWithJsonString:responseStr]);

        NSLog(@"上传图片成功");

    } failure:^(NSURLSessionDataTask * _Nullable task, NSError *_Nonnull error) {

        failure(error);

        NSLog(@"上传图片失败:%@",error.localizedDescription);

    }];

}


/**

 * 上传文件

 */

+(void)requestAFURL:(NSString *)URLString

         parameters:(id)parameters

           fileData:(NSData *)fileData

            succeed:(void (^)(id))succeed

            failure:(void (^)(NSError *))failure{

    // 1.设置API地址

    URLString = [NSStringstringWithFormat:@"%@%@",BASE_URL,[URLStringstringByReplacingOccurrencesOfString:@" "withString:@"%20"]];

    

    // 2.创建请求管理者

    AFHTTPSessionManager *manager = [AFHTTPSessionManagermanager];

    

    // 3.什么返回的结果是二进制类型

    manager.responseSerializer = [AFHTTPResponseSerializerserializer];

    

    // 4.如果报接受类型不一致请替换一致text/html或者text/plain

    manager.responseSerializer.acceptableContentTypes = [NSSetsetWithObjects:@"application/json",@"text/json",@"text/javascript",@"text/html",@"text/plain",nil];

    

    // 5.请求超时

    manager.requestSerializer.timeoutInterval =30;

    

    // 6.POST数据

    [manager POST:URLStringparameters:parametersconstructingBodyWithBlock:^(id<AFMultipartFormData_Nonnull formData) {

        

        // 将得到的二进制图片拼接到表单中 /**data,指定上传的二进制流;服务器所需参数名*/

        [formData appendPartWithFileData:fileDataname:@"file"fileName:@"audio.MP3"mimeType:@"audio.MP3"];

        

    } progress:nilsuccess:^(NSURLSessionDataTask *_Nonnull task, id _Nullable responseObject) {

        NSString *responseStr = [[NSStringalloc]initWithData:responseObjectencoding:NSUTF8StringEncoding];

        succeed([HttpsAssistdictionaryWithJsonString:responseStr]);

        NSLog(@"上传文件成功");

    } failure:^(NSURLSessionDataTask *_Nullable task,NSError *_Nonnull error) {

        failure(error);

        NSLog(@"上传文件失败:%@",error.localizedDescription);

    }];

}


/*json

 * @brief 把格式化的JSON格式的字符串转换成字典

 * @param jsonString JSON格式的字符串

 * @return 返回字典

 */

+ (NSDictionary *)dictionaryWithJsonString:(NSString *)jsonString{

    if (!jsonString) {

        returnnil;

    }

    NSData *jsonData = [jsonStringdataUsingEncoding:NSUTF8StringEncoding];

    NSError *error;

    NSDictionary *dict = [NSJSONSerializationJSONObjectWithData:jsonDataoptions:NSJSONReadingMutableContainerserror:&error];

    if (error) {

        NSLog(@"json解析失败:%@",error.localizedDescription);

        returnnil;

    }

    return dict;

}


/*json

 * @brief 把字典转换成字符串

 * @param jsonString JSON格式的字符串

 * @return 返回字符串

 */

+(NSString*)URLEncryOrDecryString:(NSDictionary *)paramDict IsHead:(BOOL)_type{

    NSArray *keyAry =  [paramDictallKeys];

    NSString *encryString =@"";

    for (NSString *keyin keyAry)

        {

            NSString *keyValue = [paramDictvalueForKey:key];

            encryString = [encryString stringByAppendingFormat:@"&"];

            encryString = [encryString stringByAppendingFormat:@"%@",key];

            encryString = [encryString stringByAppendingFormat:@"="];

            encryString = [encryString stringByAppendingFormat:@"%@",keyValue];

            }

    return encryString;

    

}





@end












猜你喜欢

转载自blog.csdn.net/pbz106/article/details/54575875