Files
featherVoice/QXLive/Network/QXRequest.m

536 lines
23 KiB
Mathematica
Raw Normal View History

2025-08-08 10:49:36 +08:00
//
// QXRequset.m
// YSDTrucksProject
//
// Created by on 2020/7/1.
// Copyright © 2020 . All rights reserved.
//
#import "QXRequest.h"
#import "QXFileManager.h"
#import <YYCache/YYCache.h>
#import "OpenUDID.h"
static AFNetworkReachabilityStatus AFNetWorkStatus; //
static NSInteger HTTP_LOGINLOSE_CODE = 301;
static NSInteger HTTP_SUCCESS_CODE = 1;
static NSInteger HTTP_ERROR_CODE = 0;
@implementation QXRequset
+(QXRequset *)shareInstance{
static QXRequset *request = nil;
static dispatch_once_t predicate;
dispatch_once(&predicate, ^{
request = [[QXRequset alloc] init];
[self checkNetworkStatus];
});
return request;
}
- (AFHTTPSessionManager *)sharedManager {
static AFHTTPSessionManager *manager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
manager = [AFHTTPSessionManager manager];
manager.responseSerializer = [AFJSONResponseSerializer serializer];
manager.responseSerializer.acceptableContentTypes = [NSSet setWithArray:@[@"application/json",
@"text/html",
@"text/json",
@"text/plain",
@"text/javascript",
@"text/xml",
@"image/*",
@"application/octet-stream",
@"application/zip"]];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
// // NO
// securityPolicy.allowInvalidCertificates = YES;
// //
// securityPolicy.validatesDomainName = NO;
// //
// NSData *certData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"server1" ofType:@"cer"]];
// securityPolicy.pinnedCertificates = [NSSet setWithObject:certData];
//
manager.securityPolicy = securityPolicy;
manager.requestSerializer.timeoutInterval = 10;
});
return manager;
}
+ (void)checkNetworkStatus {
AFNetWorkStatus = AFNetworkReachabilityStatusUnknown;
AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
[manager startMonitoring];
[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
switch (status) {
case AFNetworkReachabilityStatusUnknown:
{
//
AFNetWorkStatus = AFNetworkReachabilityStatusUnknown;
}
break;
case AFNetworkReachabilityStatusNotReachable:
{
//
AFNetWorkStatus = AFNetworkReachabilityStatusNotReachable;
}
break;
case AFNetworkReachabilityStatusReachableViaWWAN:
{
// ,
AFNetWorkStatus = AFNetworkReachabilityStatusReachableViaWWAN;
}
break;
case AFNetworkReachabilityStatusReachableViaWiFi:
{
// WIFI
AFNetWorkStatus = AFNetworkReachabilityStatusReachableViaWiFi;
}
}
if (AFNetWorkStatus != AFNetworkReachabilityStatusNotReachable){
[[NSNotificationCenter defaultCenter] postNotificationName:noticeUserLogin object:nil];
}
}];
}
- (NSURLSessionTask*)getWithUrl:(NSString *)urlString
parameters:(id)parameters
needCache:(BOOL)needCache
success:(NeQXRequsetSuccessBlock)success
fail:(NeQXRequsetFailedBlock)fail
{
RequestCachePolicy policy = IgnoringLocalCacheData;
if (needCache) {
policy = CacheDataThenLoad;
}
return [self requestWithUrl:urlString parameters:parameters type:GET cachePolicy:policy success:success cache:success failure:fail];
}
- (NSURLSessionTask*)postWithUrl:(NSString *)urlString
parameters:(id)parameters
needCache:(BOOL)needCache
success:(NeQXRequsetSuccessBlock)success
fail:(NeQXRequsetFailedBlock)fail
{
RequestCachePolicy policy = IgnoringLocalCacheData;
if (needCache) {
policy = CacheDataThenLoad;
}
return [self requestWithUrl:urlString parameters:parameters type:POST cachePolicy:policy success:success cache:success failure:fail];
}
- (NSURLSessionTask*)putWithUrl:(NSString *)urlString
parameters:(id)parameters
needCache:(BOOL)needCache
success:(NeQXRequsetSuccessBlock)success
fail:(NeQXRequsetFailedBlock)fail
{
RequestCachePolicy policy = IgnoringLocalCacheData;
if (needCache) {
policy = CacheDataThenLoad;
}
return [self requestWithUrl:urlString parameters:parameters type:PUT cachePolicy:policy success:success cache:nil failure:fail];
}
- (NSURLSessionTask*)deleteWithUrl:(NSString *)urlString
parameters:(id)parameters
needCache:(BOOL)needCache
success:(NeQXRequsetSuccessBlock)success
fail:(NeQXRequsetFailedBlock)fail
{
RequestCachePolicy policy = IgnoringLocalCacheData;
if (needCache) {
policy = CacheDataThenLoad;
}
return [self requestWithUrl:urlString parameters:parameters type:DELETE cachePolicy:policy success:success cache:nil failure:fail];
}
- (NSURLSessionTask*)patchWithUrl:(NSString *)urlString
parameters:(id)parameters
needCache:(BOOL)needCache
success:(NeQXRequsetSuccessBlock)success
fail:(NeQXRequsetFailedBlock)fail
{
RequestCachePolicy policy = IgnoringLocalCacheData;
if (needCache) {
policy = CacheDataThenLoad;
}
return [self requestWithUrl:urlString parameters:parameters type:PATCH cachePolicy:policy success:success cache:nil failure:fail];
}
- (NSURLSessionTask*)postUploadImageWithUrl:(NSString *)urlString
image:(UIImage *)image
parameters:(id)parameters
progress:(NeQXRequsetProgressBlock)progress
success:(NeQXRequsetSuccessBlock)success
fail:(NeQXRequsetFailedBlock)fail
{
AFHTTPSessionManager *manager = [self sharedManager];
if (AFNetWorkStatus == AFNetworkReachabilityStatusNotReachable) {
if (fail)fail(NOT_NETWORK_ERROR,@"无网络",nil);
return nil;
}
#warning
///
NSDictionary *headers = @{};
return [manager POST:urlString parameters:parameters headers:headers constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
NSData *imageData = UIImagePNGRepresentation(image);
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yyyyMMddHHmmss";
NSString *str = [formatter stringFromDate:[NSDate date]];
NSString *fileName = [NSString stringWithFormat:@"%@.jpg",str];
[formData appendPartWithFileData:imageData name:@"file" fileName:fileName mimeType:@"image/jpg"];
} progress:^(NSProgress * _Nonnull uploadProgress) {
if (progress)progress(uploadProgress.fractionCompleted);
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSDictionary *dict = [self getResponseDictWith:responseObject urlString:urlString];
if (success) {
success(dict);
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
if (fail){
fail(error,error.description,task);
};
NSHTTPURLResponse * responses = (NSHTTPURLResponse *)task.response;
NSLog(@"失败返回 --- URL %@ \n ---错误码 = %ld \n ---详细信息 : %@",urlString,(long)responses.statusCode,error);
}];
}
- (NSURLSessionTask*)requestWithUrl:(NSString *)urlString
parameters:(id)parameters
type:(NetworkMethod)type
cachePolicy:(RequestCachePolicy)policy
success:(NeQXRequsetSuccessBlock)success
cache:(NetResponseCache)cache
failure:(NeQXRequsetFailedBlock)fail{
AFHTTPSessionManager *manager = [self sharedManager];
///
if (AFNetWorkStatus == AFNetworkReachabilityStatusNotReachable) {
if (fail)fail(NOT_NETWORK_ERROR,@"无网络",nil);
return nil;
}
if (![urlString hasPrefix:@"http"] || ![urlString hasPrefix:@"https"]) {
urlString = [NSString stringWithFormat:@"%@%@",ServerUrl,urlString];
}
NSLog(@"发起请求 --- URL %@",urlString);
//urlkey
YYCache *myCache = [YYCache cacheWithName:@"QXCache"];
NSString *parString = parameters ? [parameters yy_modelToJSONString] : @"";
NSString *cacheKey = [NSString stringWithFormat:@"%@%@", urlString, parString];
if (cache) {
//
id object = [myCache objectForKey:cacheKey];
switch (policy) {
//
case CacheDataThenLoad: {
if (object)cache(object);
break;
}
//
case IgnoringLocalCacheData: {
break;
}
//
case CacheDataElseLoad: {
if (object) {
cache(object);
return nil;
}
break;
}
//,
case CacheDataDontLoad: {
if (object)cache(object);
return nil;
}
default: {
break;
}
}
}
#warning
///
NSDictionary *headers = @{};
[manager.requestSerializer setValue:@"iOS" forHTTPHeaderField:@"system"];
NSString *value = [OpenUDID value];
[manager.requestSerializer setValue:value forHTTPHeaderField:@"deviceId"];
NSString*appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
[manager.requestSerializer setValue:appVersion forHTTPHeaderField:@"App-Version"];
if ([QXGlobal shareGlobal].isLogin) {
[manager.requestSerializer setValue:[QXGlobal shareGlobal].loginModel.token forHTTPHeaderField:@"token"];
}
switch (type) {
case GET: {
return [manager GET:urlString parameters:parameters headers:headers progress:^(NSProgress * _Nonnull downloadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSDictionary *dict = [self getResponseDictWith:responseObject urlString:urlString];
int code = [dict[@"code"] intValue];
if (code == HTTP_LOGINLOSE_CODE) {
[[QXGlobal shareGlobal] logOut];
NSString *msg = [NSString stringWithFormat:@"%@",dict[@"msg"]];
fail(nil,msg,task);
return;
}
if (code == HTTP_ERROR_CODE) {
NSString *msg = [NSString stringWithFormat:@"%@",dict[@"msg"]];
fail(nil,msg,task);
return;
}
if (success) {
success(dict);
}
if (cache) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
if (policy != IgnoringLocalCacheData) {
[myCache setObject:dict forKey:cacheKey];
}
});
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
if (fail){
fail(error,error.description,task);
};
NSHTTPURLResponse * responses = (NSHTTPURLResponse *)task.response;
NSLog(@"失败返回 --- URL %@ \n ---错误码 = %ld \n ---详细信息 : %@",urlString,(long)responses.statusCode,error);
}];
}
break;
case POST: {
[manager.requestSerializer setValue:@"form-data" forHTTPHeaderField:@"Content-type"];
return [manager POST:urlString parameters:nil headers:@{} constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
for (NSString *key in [parameters allKeys]) {
id value = [parameters objectForKey:key];
if ([value isKindOfClass:[NSString class]]) {
[formData appendPartWithFormData:[[parameters objectForKey:key] dataUsingEncoding:NSUTF8StringEncoding] name:key];
continue;
}
if ([value isKindOfClass:[NSArray class]] || [value isKindOfClass:[NSMutableArray class]]) {
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:[parameters objectForKey:key] options:(NSJSONWritingPrettyPrinted) error:nil];
[formData appendPartWithFormData:jsonData name:key];
continue;
}
if ([value isKindOfClass:[NSNumber class]]) {
NSNumber *number = (NSNumber *)value;
NSString *numberString = number.stringValue;
NSData*stringData = [numberString dataUsingEncoding:NSUTF8StringEncoding];
[formData appendPartWithFormData:stringData name:key];
continue;
}
}
} progress:^(NSProgress * _Nonnull uploadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSDictionary *dict = [self getResponseDictWith:responseObject urlString:urlString];
int code = [dict[@"code"] intValue];
if (code == HTTP_LOGINLOSE_CODE) {
[[QXGlobal shareGlobal] logOut];
NSString *msg = [NSString stringWithFormat:@"%@",dict[@"msg"]];
fail(nil,msg,task);
return;
}
if (code == HTTP_ERROR_CODE) {
NSString *msg = [NSString stringWithFormat:@"%@",dict[@"msg"]];
fail(nil,msg,task);
return;
}
if (success) {
success(dict);
}
if (cache) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
if (policy != IgnoringLocalCacheData) {
[myCache setObject:dict forKey:cacheKey];
}
});
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
if (fail){
fail(error,error.description,task);
};
NSHTTPURLResponse * responses = (NSHTTPURLResponse *)task.response;
NSLog(@"失败返回 --- URL %@ \n ---错误码 = %ld \n ---详细信息 : %@",urlString,(long)responses.statusCode,error);
}];
}
break;
case PUT: {
return [manager PUT:urlString parameters:parameters headers:headers success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSDictionary *dict = [self getResponseDictWith:responseObject urlString:urlString];
if (success) {
success(dict);
}
if (cache) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
if (policy != IgnoringLocalCacheData) {
[myCache setObject:dict forKey:cacheKey];
}
});
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
if (fail){
fail(error,error.description,task);
};
NSHTTPURLResponse * responses = (NSHTTPURLResponse *)task.response;
NSLog(@"失败返回 --- URL %@ \n ---错误码 = %ld \n ---详细信息 : %@",urlString,(long)responses.statusCode,error);
}];
}
break;
case DELETE: {
return [manager DELETE:urlString parameters:parameters headers:headers success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSDictionary *dict = [self getResponseDictWith:responseObject urlString:urlString];
if (success) {
success(dict);
}
if (cache) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
if (policy != IgnoringLocalCacheData) {
[myCache setObject:dict forKey:cacheKey];
}
});
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
if (fail){
fail(error,error.description,task);
};
NSHTTPURLResponse * responses = (NSHTTPURLResponse *)task.response;
NSLog(@"失败返回 --- URL %@ \n ---错误码 = %ld \n ---详细信息 : %@",urlString,(long)responses.statusCode,error);
}];
}
break;
case PATCH: {
return [manager PATCH:urlString parameters:parameters headers:headers success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSDictionary *dict = [self getResponseDictWith:responseObject urlString:urlString];
if (success) {
success(dict);
}
if (cache) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
if (policy != IgnoringLocalCacheData) {
[myCache setObject:dict forKey:cacheKey];
}
});
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
if (fail){
fail(error,error.description,task);
};
NSHTTPURLResponse * responses = (NSHTTPURLResponse *)task.response;
NSLog(@"失败返回 --- URL %@ \n ---错误码 = %ld \n ---详细信息 : %@",urlString,(long)responses.statusCode,error);
}];
}
break;
default:
break;
}
}
//
-(NSDictionary*)getResponseDictWith:(id)responseObject urlString:(NSString*)urlString{
NSDictionary *dictObj;
if ([responseObject isKindOfClass:[NSDictionary class]]) {
dictObj = responseObject;
NSLog(@"成功返回 --- URL %@ \n %@",urlString,responseObject);
}else{
NSString *responseJson = [[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding];
dictObj = [responseJson jsonValueDecoded];
NSLog(@"成功返回 --- URL %@ \n %@",urlString,dictObj);
}
return dictObj;
}
///
- (void)downloadVideoPlayerWithUrl:(NSString *)url completion:(void (^)(BOOL result, NSString * fileName))completion {
if (![url isExist]) {
if (completion) {
completion(NO, nil);
}
return;
}
NSString *path = [QXFileManager createLocalSourceVideoDirectory];
NSString *fileNamePath = [path stringByAppendingPathComponent:url.lastPathComponent];
if ([QXFileManager isExistsFileWithFilePath:fileNamePath]) {
if (completion) {
completion(YES, url.lastPathComponent);
}
return;
}
[self downloadDataWithUrl:url fileNamePath:fileNamePath localSourceDir:path completion:completion];
}
///
- (void)downloadDataWithUrl:(NSString *)url fileNamePath:(NSString *)fileNamePath localSourceDir:(NSString *)localSourceDir completion:(void (^)(BOOL, NSString * _Nullable))completion {
if (![url isExist] || ![fileNamePath isExist] || ![localSourceDir isExist]) {
if (completion) {
completion(NO, nil);
}
return;
}
NSURLSessionTask *task = [self downloadApi:url filePath:localSourceDir progress:^(NSProgress * _Nonnull downloadProgress) {
NSLog(@"downloadProgress == %@",downloadProgress);
} completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
if ([QXFileManager isExistsFileWithFilePath:fileNamePath]) {
if (completion) {
completion(YES, url.lastPathComponent);
}
}else {//
if (completion) {
completion(NO, nil);
}
}
}];
[task resume];
}
- (NSURLSessionTask *)downloadApi:(NSString *)url
filePath: (NSString *)filePath
progress:(nullable void (^)(NSProgress * _Nonnull))downloadProgress
completionHandler: (QXDownloadCompletionHandler)completionHandler{
return [self downloadApi:url
filePath:filePath
fileName:url.lastPathComponent
progress:downloadProgress
completionHandler:completionHandler];
}
- (NSURLSessionTask *)downloadApi:(NSString *)url
filePath:(NSString *)filePath
fileName:(NSString *)fileName
progress:(void (^)(NSProgress * _Nonnull))downloadProgress
completionHandler:(QXDownloadCompletionHandler)completionHandler {
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
AFSecurityPolicy *policy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
manager.securityPolicy = policy;
NSURLRequest *requst = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];
return [manager downloadTaskWithRequest:requst
progress:downloadProgress
destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
NSString *realPath = [filePath stringByAppendingPathComponent:fileName];
return [NSURL fileURLWithPath:realPath];
} completionHandler:completionHandler];
}
@end