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.
163 lines
7.4 KiB
163 lines
7.4 KiB
4 years ago
|
//
|
||
|
// 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
|