网络请求基本是每个项目都会用到的,所有,做一个简单封装的网络工具类还是很有必要的,因为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