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

//
// 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