对AFnetworking网络请求框架简单封装
声明
#import <Foundation/Foundation.h>
@interface DZC_Request_Mode : NSObject
//检测网络状态
+ (void)netWorkStatusWith:(NSString *)str success:(void(^)(long statue))statue;
//JSON方式获取数据
+ (void)JSONDataWithUrl:(NSString *)url success:(void (^)(id json))success fail:(void (^)(NSError *))fail;
//xml方式获取数据
+ (void)XMLDataWithUrl:(NSString *)urlStr success:(void (^)(id xml))success fail:(void (^)())fail ;
//post提交json数据
+ (void)postJSONWithUrl:(NSString *)urlStr parameters:(id)parameters success:(void (^)(id responseObject))success fail:(void (^)(NSError *err))fail ;
//下载文件
+ (void)sessionDownloadWithUrl:(NSString *)urlStr success:(void (^)(NSURL *fileURL))success fail:(void (^)())fail;
//文件上传-自定义上传文件名
+ (void)postUploadWithUrl:(NSString *)urlStr fileUrl:(NSURL *)fileURL fileName:(NSString *)fileName fileType:(NSString *)fileTye progress:(void(^)())progress success:(void (^)(id responseObject))success fail:(void (^)())fail;
//文件上传-随机生成文件名
+ (void)postUploadWithUrl:(NSString *)urlStr fileUrl:(NSURL *)fileURL progress:(void(^)())progress success:(void (^)(id responseObject))success fail:(void (^)())fail ;
//处理服务器返回的数据
+(NSDictionary *)handleModleData:(NSData *)_data;
//获取token
+(void)TokenDataWithUrl:(NSString *)url success:(void(^)(id token))success fail:(void(^)(NSString *fail))fail;
//增加Header属性
+(AFHTTPSessionManager *)addHeader;
@end```
**实现**
import “DZC_Request_Mode.h”
@interface DZC_Request_Mode ()
@end
@implementation DZC_Request_Mode
+(void)netWorkStatusWith:(NSString *)str success:(void (^)(long))statue
{
[[AFNetworkReachabilityManager sharedManager] startMonitoring];
// 检测网络连接的单例,网络变化时的回调方法
[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
DLog(@"%ld", (long)status);
statue((long)status);
}];
}
+(void)netWorkStatus
{
/**
AFNetworkReachabilityStatusUnknown = -1, // 未知
AFNetworkReachabilityStatusNotReachable = 0, // 无连接
AFNetworkReachabilityStatusReachableViaWWAN = 1, // 3G 花钱
AFNetworkReachabilityStatusReachableViaWiFi = 2, // WiFi
*/
// 如果要检测网络状态的变化,必须用检测管理器的单例的startMonitoring
[[AFNetworkReachabilityManager sharedManager] startMonitoring];
// 检测网络连接的单例,网络变化时的回调方法
[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
DLog(@"%ld", (long)status);
}];
}
+(void)JSONDataWithUrl:(NSString *)url success:(void (^)(id))success fail:(void (^)(NSError *fail))fail
{
AFHTTPSessionManager *manager = [self addHeader];
manager.responseSerializer=[AFHTTPResponseSerializer serializer];
// 网络访问是异步的,回调是主线程的,因此程序员不用管在主线程更新UI的事情
[manager GET:url parameters:nil progress:^(NSProgress * _Nonnull downloadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
dispatch_async(dispatch_get_global_queue(0, 0), ^{
DLog(@"%@",responseObject);
NSDictionary *dict=[self handleModleData:responseObject];
if (dict)
{
dispatch_async(dispatch_get_main_queue(), ^{
success(dict);//将服务器返回的数字以字典的形式传给控制器
});
}
});
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
fail(error);//请求出错
}];
}
//同步获取token数据
+(void)TokenDataWithUrl:(NSString )url success:(void (^)(id))success fail:(void (^)(NSString ))fail
{
NSURL *URL=[NSURL URLWithString:url];
NSURLRequest *request=[[NSURLRequest alloc]initWithURL:URL cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10.0];
//request=[DZCAddHeader UrlAddHeader:request];//增加header
NSData *data1= [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
if (data1!=nil)
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docDir = [paths objectAtIndex:0];
docDir=[docDir stringByAppendingPathComponent:@"token.txt"];
NSDictionary *dict=[NSJSONSerialization JSONObjectWithData:data1 options:NSJSONReadingMutableLeaves error:nil];
[dict writeToFile:docDir atomically:YES];
DLog(@"%@",dict);
DLog(@"%@",[dict objectForKey:@"data"]);
NSString *jiemiStr=[DzcDES DecodeBase64:[dict objectForKey:@"data"]];
DLog(@"解密后字符串%@---%@",jiemiStr,docDir);
NSDictionary *jiemidict=[DzcDES dictionaryWithJsonString:jiemiStr];
DLog(@"输出明文数据字典%@",jiemidict);
[[NSUserDefaults standardUserDefaults]removeObjectForKey:@"token"];
DZCUiapplication *dzc=[DZCUiapplication shareApplication];
dzc.Requesthost=[jiemidict valueForKey:@"Host"];
dzc.requestHosts=[jiemidict objectForKey:@"Hosts"];
//dzc.Requesthost=@"cache4.video.v.zhuovi.cn";
[[NSUserDefaults standardUserDefaults]setObject:[jiemidict valueForKey:@"Token"] forKey:@"token"];
[[NSUserDefaults standardUserDefaults]setObject:dzc.Requesthost forKey:@"requestHost"];
if ([[dict valueForKey:@"state"]isEqualToString:@"success"])
{
success([dict valueForKey:@"state"]);
}
else
{
fail([dict valueForKey:@"msg"]);
}
}
else
{
[[NSUserDefaults standardUserDefaults]setValue:@"7C26642A4F204DF48791F8C2B776D046" forKey:@"token"];
}
}
+(void)XMLDataWithUrl:(NSString *)urlStr success:(void (^)(id))success fail:(void (^)())fail
{
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// 返回的数据格式是XML
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
//NSDictionary *dict = @{@"format": @"xml"};
// 网络访问是异步的,回调是主线程的,因此程序员不用管在主线程更新UI的事情
[manager GET:urlStr parameters:nil progress:^(NSProgress * _Nonnull downloadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
DLog(@"xml:%@",responseObject);
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSString *str=[[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding];
DLog(@"%@",str);
NSDictionary *dict=[DzcDES dictionaryWithJsonString:str];
if ([[dict objectForKey:@"state"]isEqualToString:@"success"])
{
NSString * s=[dict valueForKey:@"data"];
s=[DzcDES DecodeBase64:s];
dispatch_async(dispatch_get_main_queue(), ^{
success(s);
});
}
});
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
fail();
}];
}
+(void)postJSONWithUrl:(NSString *)urlStr parameters:(id)parameters success:(void (^)(id))success fail:(void (^)(NSError *err))fail
{
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// 设置请求格式
// manager.requestSerializer = [AFJSONRequestSerializer serializer];
// 设置返回格式
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
[manager POST:urlStr parameters:parameters progress:^(NSProgress * _Nonnull uploadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSDictionary *dict= [self handleModleData:responseObject];
DLog(@"JSON:%@",responseObject);
success(dict);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
DLog(@"%@",error);
fail(error);
}];
}
//下载文件
+(void)sessionDownloadWithUrl:(NSString )urlStr success:(void (^)(NSURL ))success fail:(void (^)())fail
{
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];
NSURL *URL = [NSURL URLWithString:urlStr];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
//NSURL *documentsDirectoryURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil];
// 指定下载文件保存的路径
// NSLog(@"%@ %@", targetPath, response.suggestedFilename);
// 将下载文件保存在缓存路径中
NSString *cacheDir = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
NSString *path = [cacheDir stringByAppendingPathComponent:response.suggestedFilename];
// URLWithString返回的是网络的URL,如果使用本地URL,需要注意
// NSURL *fileURL1 = [NSURL URLWithString:path];
NSURL *fileURL = [NSURL fileURLWithPath:path];
// NSLog(@"== %@ |||| %@", fileURL1, fileURL);
if (success) {
success(fileURL);
}
return fileURL;//[documentsDirectoryURL URLByAppendingPathComponent:[response suggestedFilename]];
} completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
NSLog(@"File downloaded to: %@", filePath);
if (error)
{
fail(error);
}
}];
[downloadTask resume];
}
//文件上传-自定义上传文件名
+(void)postUploadWithUrl:(NSString )urlStr fileUrl:(NSURL )fileURL fileName:(NSString )fileName fileType:(NSString )fileTye progress:(void(^)())progress success:(void (^)(id))success fail:(void (^)())fail
{
NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:urlStr parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
[formData appendPartWithFileURL:fileURL name:@"file" fileName:fileName mimeType:fileTye error:nil];
} error:nil];
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
NSURLSessionUploadTask *uploadTask;
uploadTask = [manager
uploadTaskWithStreamedRequest:request
progress:^(NSProgress * _Nonnull uploadProgress) {
// This is not called back on the main queue.
// You are responsible for dispatching to the main queue for UI updates
dispatch_async(dispatch_get_main_queue(), ^{
progress(uploadProgress.fractionCompleted);
//Update the progress view
//[progressView setProgress:uploadProgress.fractionCompleted];
});
}
completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) {
if (error) {
NSLog(@"Error: %@", error);
fail(error);
} else {
NSLog(@"%@ %@", response, responseObject);
success(responseObject);
}
}];
[uploadTask resume];
}
//文件上传-随机生成文件名
+(void)postUploadWithUrl:(NSString )urlStr fileUrl:(NSURL )fileURL progress:(void(^)())progress success:(void (^)(id))success fail:(void (^)())fail
{
NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:urlStr parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
[formData appendPartWithFileURL:fileURL name:@"fileupdata" error:nil];
} error:nil];
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
NSURLSessionUploadTask *uploadTask;
uploadTask = [manager
uploadTaskWithStreamedRequest:request
progress:^(NSProgress * _Nonnull uploadProgress) {
// This is not called back on the main queue.
// You are responsible for dispatching to the main queue for UI updates
dispatch_async(dispatch_get_main_queue(), ^{
progress(uploadProgress.fractionCompleted);
//Update the progress view
//[progressView setProgress:uploadProgress.fractionCompleted];
});
}
completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) {
if (error) {
NSLog(@"Error: %@", error);
fail(error);
} else {
NSLog(@"%@ %@", response, responseObject);
success(responseObject);
}
}];
[uploadTask resume];
}
//将服务器返回的数据转变成字典对象
+(NSDictionary )handleModleData:(NSData )_data
{
NSString *str=[[NSString alloc]initWithData:_data encoding:NSUTF8StringEncoding];
NSDictionary *dict=[DzcDES dictionaryWithJsonString:str];
DLog(@"handleModleData%@",dict);
return dict;
/*
if ([[dict valueForKey:@"state"]isEqualToString:@"success"]&&![[dict valueForKey:@"data"]isEqualToString:@""])
{
str=[dict objectForKey:@"data"];
str=[DzcDES jiemiString:str];
str=[DzcDES DecodeBase64:str];
DLog(@"数据请求成功%@",str);
dict=[DzcDES dictionaryWithJsonString:str];
if (dict)
{
DLog(@"%@",dict);
return dict;
}
else
{
return dict;
}
}
else
{
return dict;
}
*/
}
//增加Header属性
+(AFHTTPSessionManager *)addHeader
{
AFHTTPSessionManager *manger=[AFHTTPSessionManager manager];
DZCUiapplication *dzc=[DZCUiapplication shareApplication];
[manger.requestSerializer setValue:[DzcDES getAppVersion] forHTTPHeaderField:@"AppUserVer"];
[manger.requestSerializer setValue:@"1111111111111" forHTTPHeaderField:@"AppUserSessionID"];
if ([dzc.Phone isEqualToString:@""])
{
[manger.requestSerializer setValue:@"" forHTTPHeaderField:@"AppUserPhone"];
}
else
{
[manger.requestSerializer setValue:dzc.Phone forHTTPHeaderField:@"AppUserPhone"];
}
[manger.requestSerializer setValue:[DzcDES getIdentifierStr] forHTTPHeaderField:@"AppUserIEME"];
if ([dzc.ID isEqualToString:@""])
{
[manger.requestSerializer setValue:@"" forHTTPHeaderField:@"AppUserID"];
}
else
{
[manger.requestSerializer setValue:dzc.ID forHTTPHeaderField:@"AppUserID"];
}
[manger.requestSerializer setValue:[DzcDES getUserphoneModel] forHTTPHeaderField:@"AppUserOS"];
[manger.requestSerializer setValue:[DzcDES getUserPhoneVersion] forHTTPHeaderField:@"AppUserModal"];
[manger.requestSerializer setValue:[DzcDES macaddress] forHTTPHeaderField:@"AppUserMac"];
[manger.requestSerializer setValue:AppUserAppID forHTTPHeaderField:@"AppUserAppID"];
return manger;
}
@end
“`