You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
162 lines
7.4 KiB
162 lines
7.4 KiB
// |
|
// TFNetworkTools.m |
|
// WXReader |
|
// |
|
// Created by 谢腾飞 on 2020/12/3. |
|
// Copyright © 2020 xtfei_2011@126.com. All rights reserved. |
|
// |
|
|
|
#import "TFNetworkTools.h" |
|
#import <XHNetworkCache.h> |
|
#import "CommonCrypto/CommonDigest.h" |
|
#import "NSString+TFExtension.h" |
|
|
|
// 请求成功 |
|
#define Request_Success_From(x) [[NSString stringWithFormat:@"%@",[x objectForKey:@"code"]] isEqualToString:@"0"] |
|
|
|
static NSString * const kCode = @"code"; |
|
static NSString * const kMsg = @"msg"; |
|
static NSString * const kData = @"data"; |
|
|
|
@implementation TFNetworkTools |
|
|
|
+ (void)POST:(NSString *)url parameters:(NSDictionary * _Nullable)parameters model:(Class _Nullable)model success:(requestSuccessBlock)success failure:(requestFailedBlock)failure |
|
{ |
|
[self POST:url parameters:parameters model:model completionQueue:dispatch_get_main_queue() success:success failure:failure]; |
|
} |
|
|
|
+ (void)POSTQuick:(NSString *)url parameters:(NSDictionary * _Nullable)parameters model:(Class _Nullable)model success:(quickRequestSuccessBlock)success failure:(requestFailedBlock)failure |
|
{ |
|
// 读取缓存数据,若存在则返回缓存数据 |
|
NSString *prefix = [url stringByAppendingString:TFLanguageManager.serverLocalized]; |
|
if ([XHNetworkCache checkCacheWithURL:prefix params:parameters]) { |
|
NSDictionary *dic = [NSDictionary dictionaryWithDictionary:[XHNetworkCache cacheJsonWithURL:prefix params:parameters]]; |
|
TFNetworkRequestModel *requestModel = [[TFNetworkRequestModel alloc] init]; |
|
requestModel.data = dic; |
|
dispatch_async(dispatch_get_main_queue(), ^{ |
|
!success ?: success(YES, model ? [model modelWithDictionary:dic] : dic, YES, requestModel); |
|
}); |
|
} |
|
|
|
[self POST:url parameters:parameters model:model completionQueue:dispatch_get_main_queue() success:^(BOOL isSuccess, id _Nullable t_model, TFNetworkRequestModel * _Nonnull requestModel) { |
|
if (isSuccess) { |
|
[XHNetworkCache save_asyncJsonResponseToCacheFile:model ? [t_model modelToJSONObject] : requestModel.data andURL:prefix params:parameters completed:nil]; |
|
} |
|
!success ?: success(isSuccess, t_model, NO, requestModel); |
|
} failure:failure]; |
|
} |
|
|
|
+ (void)POST:(NSString *)url parameters:(NSDictionary *)parameters model:(Class _Nullable)model completionQueue:(dispatch_queue_t)completionQueue success:(requestSuccessBlock)success failure:(requestFailedBlock)failure |
|
{ |
|
// 没有网络则直接返回 |
|
if (![TFNetworkManager networkingStatus]) return; |
|
|
|
TFLog(@"--->请求地址URL:%@",url); |
|
url = [APIURL stringByAppendingString:url]; |
|
url = url.networkUrl; |
|
parameters = [self integrationRequestWithParameters:parameters ?: @{}]; |
|
|
|
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy defaultPolicy]; |
|
securityPolicy.allowInvalidCertificates = YES; |
|
securityPolicy.validatesDomainName = NO; |
|
|
|
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; |
|
manager.securityPolicy = securityPolicy; |
|
manager.responseSerializer = [AFJSONResponseSerializer serializer]; |
|
manager.requestSerializer = [AFJSONRequestSerializer serializer]; |
|
|
|
[manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; |
|
[manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"]; |
|
[manager.requestSerializer setTimeoutInterval:kOvertime]; |
|
manager.completionQueue = completionQueue; |
|
|
|
TFLog(@"--->请求参数%@",manager); |
|
|
|
[manager POST:url parameters:parameters headers:@{@"Content-Type":@"application/json", @"Accept":@"application/json"} progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { |
|
|
|
TFLog(@"--->请求成功返回%@",responseObject); |
|
|
|
NSDictionary *dic = [NSDictionary dictionaryWithDictionary:responseObject]; |
|
TFNetworkRequestModel *requestModel = [[TFNetworkRequestModel alloc] init]; |
|
requestModel.task = task; |
|
requestModel.data = dic[kData]; |
|
requestModel.msg = [NSString stringWithFormat:@"%@", dic[kMsg]]; |
|
requestModel.code = [dic[kCode] integerValue]; |
|
|
|
if (requestModel.code != 704) { // 704 请求重复排除 |
|
!success ?: success(Request_Success_From(dic), model ? [model modelWithDictionary:dic[kData]] : dic, requestModel); |
|
} |
|
|
|
[manager.session finishTasksAndInvalidate]; |
|
if (requestModel.code == 301 || requestModel.code == 302) { |
|
[kNotification postNotificationName:Notification_Logout object:nil]; |
|
} |
|
|
|
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { |
|
TFLog(@"--->请求失败返回:%@",error); |
|
!failure ?: failure(task, error); |
|
[manager.session finishTasksAndInvalidate]; |
|
}]; |
|
} |
|
|
|
+ (NSString *)authString:(NSDictionary *)params |
|
{ |
|
NSArray *allKeys = params.allKeys; |
|
allKeys = [allKeys sortedArrayUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) { |
|
return [obj1 compare:obj2 options:NSNumericSearch]; |
|
}]; |
|
|
|
NSMutableArray *signArray = [NSMutableArray array]; |
|
for (NSString *key in allKeys) { |
|
NSString *keyValue = [NSString stringWithFormat:@"%@=%@", key, params[key]]; |
|
[signArray addObject:keyValue]; |
|
} |
|
|
|
NSString *signString = [signArray componentsJoinedByString:@"&"]; |
|
signString = [NSString stringWithFormat:@"%@%@%@", app_key, signString, secret_key]; |
|
|
|
return [self stringToMD5:signString]; |
|
} |
|
|
|
+ (NSDictionary *)integrationRequestWithParameters:(NSDictionary *)parameters |
|
{ |
|
NSMutableDictionary *integrationParament = [NSMutableDictionary dictionaryWithDictionary:parameters]; |
|
[integrationParament setObject:App_Ver forKey:@"ver"]; |
|
[integrationParament setObject:@"1" forKey:@"osType"]; |
|
[integrationParament setObject:@"1" forKey:@"appId"]; |
|
[integrationParament setObject:@"1" forKey:@"product"]; |
|
[integrationParament setObject:@"AppStore" forKey:@"marketChannel"]; |
|
[integrationParament setObject:[[NSBundle mainBundle] bundleIdentifier] forKey:@"packageName"]; |
|
[integrationParament setObject:[TFUtilsHelper getTimeStamp] ? : @"" forKey:@"time"]; |
|
[integrationParament setObject:[TFUtilsHelper getUDID] ? : @"" forKey:@"udid"]; |
|
[integrationParament setObject:[TFUtilsHelper getSystemVersion] ? : @"" forKey:@"sysVer"]; |
|
[integrationParament setObject:[TFUtilsHelper getCurrentDeviceModel] ? : @"" forKey:@"phoneModel"]; |
|
[integrationParament setObject:[TFUserInfoManager shareInstance].token forKey:@"token"]; |
|
[integrationParament setObject:@"zh" forKey:@"language"]; |
|
// [integrationParament setObject:[TFLanguageManager serverLocalized] forKey:@"language"]; |
|
[integrationParament setObject:[self authString:integrationParament] ? : @"" forKey:@"sign"]; |
|
|
|
return integrationParament; |
|
} |
|
|
|
+ (NSString *)stringToMD5:(NSString *)inputStr |
|
{ |
|
const char *cStr = [inputStr UTF8String]; |
|
unsigned char result[CC_MD5_DIGEST_LENGTH]; |
|
CC_MD5(cStr,(CC_LONG)strlen(cStr), result); |
|
NSString *resultStr = [NSString stringWithFormat:@"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", |
|
result[0], result[1], result[2], result[3], |
|
result[4], result[5], result[6], result[7], |
|
result[8], result[9], result[10], result[11], |
|
result[12], result[13], result[14], result[15] |
|
]; |
|
return [resultStr lowercaseString]; |
|
} |
|
|
|
@end |
|
|
|
|
|
|
|
@implementation TFNetworkRequestModel |
|
|
|
@end
|
|
|