DSNetworkTool.m
7.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
//
// 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