DSNetworkTool.m 7.7 KB
//
//  DSNetworkTool.m
//  DreamSleep
//
//  Created by peter on 2022/4/13.
//

NSString * const RetureError = @"Error";
NSString * const ServerError = @"服务器错误";
NSString * const NetworkCancel = @"网络已取消";
NSString * const ServerDataFormatError = @"服务器返回的数据格式异常";
NSString * const NetworkUnableError = @"网络不给力,请检查您的网络设置";

#import "DSNetworkTool.h"

@implementation DSNetworkTool

+ (DSNetworkTool *)sharedManager {
    static DSNetworkTool *handle = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        handle = [DSNetworkTool manager];
        // handle.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
        handle.requestSerializer = [AFHTTPRequestSerializer serializer];
        handle.responseSerializer = [AFHTTPResponseSerializer serializer];
        handle.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/html", @"text/plain", nil];
        handle.requestSerializer.timeoutInterval = 60.0;
    });
    return handle;
}

+ (__kindof NSURLSessionDataTask *)httpPostBodyRequestWithAPI:(NSString *)api
                                                       params:(id)params
                                                         view:(UIView *)view
                                               hasNetActivity:(BOOL)hasNetActivity
                                                  loadingInfo:(NSString *)loadingInfo
                                                  hasFailInfo:(BOOL)hasFailInfo
                                                      success:(void (^)(NSDictionary *apiDic))success
                                                      failure:(void (^)(id failure))failure
{
    dispatch_async(dispatch_get_main_queue(), ^{
        [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:hasNetActivity];
        
        if (loadingInfo) {
            view ? [DSProgressHUD showProgressHUDWithInfo:loadingInfo inView:view] : [DSProgressHUD showProgressHUDWithInfo:loadingInfo];
        }
    });
    
    NSString *urlString = [APIURL stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
    
    DSLog(@"请求链接:%@,业务参数:%@", urlString, params);
    
    NSMutableURLRequest *request = [[AFJSONRequestSerializer serializer] requestWithMethod:@"POST" URLString:urlString parameters:nil error:nil];
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:params options:NSJSONWritingPrettyPrinted error:nil];
    [request setHTTPBody:jsonData];
    [request addValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    // 请求头自定义字段sid
    [request addValue:[LoginUtils getSid] forHTTPHeaderField:@"sid"];
    
    NSURLSessionDataTask *dataTask = [[DSNetworkTool sharedManager] dataTaskWithRequest:request uploadProgress:nil downloadProgress:nil completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) {
        dispatch_async(dispatch_get_main_queue(), ^{
            [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
            
            if (loadingInfo) { [DSProgressHUD dissmissProgressHUD]; }
        });
        
        // 处理服务器内部错误
        NSHTTPURLResponse *httpRes = (NSHTTPURLResponse *)response;
        if (httpRes && !(httpRes.statusCode == 200)) {
            DSLog(@"httpRes:%@", httpRes);
            NSString *errInfo = [NSHTTPURLResponse localizedStringForStatusCode:httpRes.statusCode];
            failure(@{@"errorCode":@(DSResCodeServerErr), @"errMessage":errInfo});
            if (hasFailInfo) {
                view ? [DSProgressHUD showDetailInfo:errInfo inView:view] : [DSProgressHUD showDetailInfo:errInfo];
            }
            return;
        }
        
        if (responseObject) {
            NSDictionary *responseDic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];
            // 数据验证
            if (!responseDic || ![responseDic isKindOfClass:[NSDictionary class]]) {
                failure(@{@"errorCode":@(DSResCodeDataWrong), @"errMessage":ServerDataFormatError});
                if (hasFailInfo) {
                    view ? [DSProgressHUD showDetailInfo:ServerDataFormatError inView:view] : [DSProgressHUD showDetailInfo:ServerDataFormatError];
                }
                return;
            }
            // DSLog(@"服务器返回的正确的原始Json数据:%@", responseDic);
            // 接口业务数据
            NSString *apiStr = (api && [api isKindOfClass:[NSString class]]) ? api : @"";
            NSDictionary *apiDataDic = responseDic[@"data"][apiStr];
            
            NSInteger res_code = [apiDataDic[@"res_code"] integerValue];
            if (res_code == DSResCodeSuccess) {
                success(apiDataDic);
            } else {
                NSString *errMessage = (apiDataDic[@"error"] && [apiDataDic[@"error"] isKindOfClass:[NSString class]]) ? apiDataDic[@"error"] : @"未知错误";
                failure(@{@"errorCode":@(res_code), @"errMessage":errMessage});
                view ? [DSProgressHUD showDetailInfo:errMessage inView:view] : [DSProgressHUD showDetailInfo:errMessage];
            }
        } else {
            // 网络异常
            DSLog(@"网络异常错误信息:%@", error);
            NSString *netErrMessage = NetworkCancel;
            if (error.code != -999) {
                netErrMessage = NetworkUnableError;
                if (error.code == -1011) {
                    netErrMessage = ServerError;
                } else if (error.code == -1016) {
                    netErrMessage = ServerDataFormatError;
                }
            }
            failure(@{@"errorCode":@(DSResCodeNetFail), @"errMessage":netErrMessage});
            if (hasFailInfo) {
                view ? [DSProgressHUD showDetailInfo:netErrMessage inView:view] : [DSProgressHUD showDetailInfo:netErrMessage];
            }
        }
    }];
    [dataTask resume];
    return dataTask;
}

+ (__kindof NSURLSessionDataTask *)httpVendorPostRequestWithHost:(NSString *)host
                                                          params:(id)params
                                                            view:(UIView *)view
                                                  hasNetActivity:(BOOL)hasNetActivity
                                                     loadingInfo:(NSString *)loadingInfo
                                                     hasFailInfo:(BOOL)hasFailInfo
                                                         success:(void (^)(NSDictionary *responseObj))success
                                                         failure:(void (^)(id failureInfo))failure
{
    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:hasNetActivity];
    if (loadingInfo) {
        view ? [DSProgressHUD showProgressHUDWithInfo:loadingInfo inView:view] : [DSProgressHUD showProgressHUDWithInfo:loadingInfo];
    }
    
    NSString *urlString = [host stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
    
    DSLog(@"Vendor Post请求地址:%@,业务参数:%@", urlString, params);
    
    NSURLSessionDataTask *dataTask = [[DSNetworkTool sharedManager] POST:urlString parameters:params headers:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        DSLog(@"responseObject:%@", responseObject);
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        
    }];
    [dataTask resume];
    
    return dataTask;
}

@end