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
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
//
// ZJBaseHttpManager.m
// HDMall
//
// Created by Javen on 2017/7/27.
// Copyright © 2017年 上海勾芒信息科技. All rights reserved.
//
#import "ZJBaseHttpManager.h"
#import "AFNetworking.h"
#import "ZJShowLogView.h"
#import "JSONKit.h"
#import "ZJBaseFileModel.h"
@interface ZJBaseHttpManager ()
@property (nonatomic, strong) AFHTTPSessionManager *manager;
@end
@implementation ZJBaseHttpManager
+ (ZJBaseHttpManager *)shareCilent {
static ZJBaseHttpManager *cilent;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
cilent = [[ZJBaseHttpManager alloc] init];
cilent.debugLogEnabled = NO;
});
return cilent;
}
- (AFHTTPSessionManager *)manager {
if (!_manager) {
_manager = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:REST_BASE_URL]];
_manager.responseSerializer = [AFJSONResponseSerializer serializer];
_manager.requestSerializer = [AFJSONRequestSerializer serializer];
[_manager.requestSerializer setValue:@"application/json;charset=utf-8"
forHTTPHeaderField:@"Content-Type"];
[_manager.requestSerializer setValue:@"close" forHTTPHeaderField:@"Connection"];
[_manager.requestSerializer setValue:@"application/json;charset=utf-8"
forHTTPHeaderField:@"Accept"];
_manager.requestSerializer.timeoutInterval = 120.0f;
}
return _manager;
}
/**
设置证书(https)请求需要用到
*/
- (void)setSecurityPolicy {
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
// allowInvalidCertificates 是否允许无效证书(也就是自建的证书),默认为NO
// 如果是需要验证自建证书,需要设置为YES
securityPolicy.allowInvalidCertificates = YES;
//validatesDomainName 是否需要验证域名,默认为YES;
//假如证书的域名与你请求的域名不一致,需把该项设置为NO;如设成NO的话,即服务器使用其他可信任机构颁发的证书,也可以建立连接,这个非常危险,建议打开。
//置为NO,主要用于这种情况:客户端请求的是子域名,而证书上的是另外一个域名。因为SSL证书上的域名是独立的,假如证书上注册的域名是www.google.com,那么mail.google.com是无法验证通过的;当然,有钱可以注册通配符的域名*.google.com,但这个还是比较贵的。
//如置为NO,建议自己添加对应域名的校验逻辑。
securityPolicy.validatesDomainName = NO;
[_manager setSecurityPolicy:securityPolicy];
}
- (void)POST:(NSString *)URLString
parameters:(id)parameters
complete:(void (^)(id responseObject, NSError *error))complete {
HIDE_KEYBOARD;
NSString *url = [URLString
encodeUTF8];
WS(weakSelf);
[self.manager POST:url
parameters:parameters
progress:nil
success:^(NSURLSessionDataTask *task,
id responseObject) {
[weakSelf logWithUrl:URLString Method:@"POST" param:parameters respones:responseObject];
complete(responseObject, nil);
}
failure:^(NSURLSessionDataTask *task, NSError *error) {
complete(nil, error);
[weakSelf logWithUrl:URLString Method:@"POST" param:parameters respones:error];
}];
}
- (void)GET:(NSString *)URLString
parameters:(id)parameters
complete:(void (^)(id responseObject, NSError *error))complete {
HIDE_KEYBOARD;
WS(weakSelf);
[self.manager GET:URLString
parameters:parameters
progress:nil
success:^(NSURLSessionDataTask *task,
id responseObject) {
[weakSelf logWithUrl:URLString Method:@"GET" param:parameters respones:responseObject];
complete(responseObject, nil);
}
failure:^(NSURLSessionDataTask *task, NSError *error) {
[weakSelf logWithUrl:URLString Method:@"GET" param:parameters respones:error];
complete(nil, error);
}];
}
- (void)PUT:(NSString *)URLString
parameters:(id)parameters
complete:(void (^)(id responseObject, NSError *error))complete {
HIDE_KEYBOARD;
WS(weakSelf);
NSString *url = [URLString
encodeUTF8];
[self.manager PUT:url
parameters:parameters
success:^(NSURLSessionDataTask *task,
id responseObject) {
[self logWithUrl:URLString Method:@"PUT" param:parameters respones:responseObject];
complete(responseObject, nil);
}
failure:^(NSURLSessionDataTask *task, NSError *error) {
complete(nil, error);
[weakSelf logWithUrl:url Method:@"PUT" param:parameters respones:error];
}];
}
- (void)DELETE:(NSString *)URLString
parameters:(id)parameters
complete:(void (^)(id responseObject, NSError *error))complete {
HIDE_KEYBOARD;
NSString *url = [URLString encodeUTF8];
WS(weakSelf);
[self.manager DELETE:url
parameters:parameters
success:^(NSURLSessionDataTask *task, id responseObject) {
[weakSelf logWithUrl:url Method:@"DELETE" param:parameters respones:responseObject];
complete(responseObject, nil);
}
failure:^(NSURLSessionDataTask *task, NSError *error) {
complete(nil, error);
[weakSelf logWithUrl:url Method:@"DELETE" param:parameters respones:error];
}];
}
/** 上传文件 */
- (void)upLoadFiles:(NSArray<ZJBaseFileModel *> *)files
params:(NSDictionary *)params
commplete:(void (^__nullable)(NSMutableArray *attachments))complete{
if (files.count == 0) {
complete(nil);
return;
}
WS(weakSelf);
[self.manager POST:@"media/upload/list" parameters:params constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
for (ZJBaseFileModel *file in files) {
[formData appendPartWithFileData:file.data //data
name:file.keyName //接口key值
fileName:file.name //文件名称,必须有后缀
mimeType:file.mimeType]; //文件类型,后台接受使用
}
} progress:^(NSProgress * _Nonnull uploadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
if (kIsResponse) {
complete(responseObject[@"data"]);
} else {
kFalseHttpTips;
}
[weakSelf logWithUrl:@"media/upload/list" Method:@"UPLOAD" param:params respones:responseObject];
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
[MBProgressHUD j_error:@"上传失败" complete:nil];
[weakSelf logWithUrl:@"media/upload/list" Method:@"UPLOAD" param:params respones:error];
}];
}
/**
打印网络请求的详情
*/
- (void)logWithUrl:(NSString *)URLString Method:(NSString *)method param:(NSDictionary *)param respones:(id)response {
NSString *jsonString = [param JSONStringWithOptions:JKSerializeOptionPretty error:nil];
NSString *responseString = nil;
NSString *isSuccess = nil;
if ([response isKindOfClass:[NSDictionary class]]) {
responseString = [response JSONStringWithOptions:JKSerializeOptionPretty error:nil];
isSuccess = @"SUCCESSED";
} else if ([response isKindOfClass:[NSError class]]) {
responseString = [response localizedDescription];
isSuccess = @"FAILED";
NSString *errorInfo = [NSString stringWithFormat:@"%@ \n %@\n", URLString, responseString];
NSString *userInfo = [((NSError *) response).userInfo JSONStringWithOptions:JKSerializeOptionPretty error:nil];
errorInfo = [errorInfo stringByAppendingString:SAFE_STRING(userInfo)];
[MBProgressHUD j_error:errorInfo complete:nil];
}
NSString *line = @"\n<<<<<<<<<<<<<<<<<<<<<\n\nMETHOD ";
NSString *end = @"\n>>>>>>>>>>>>>>>>>>>>>\n\n";
NSString *msg = [line stringByAppendingString:method];
msg = [msg stringByAppendingString:[NSString stringWithFormat:@"\n\nURL: %@/%@\n\n", REST_BASE_URL, URLString]];
msg = [msg stringByAppendingString:[NSString stringWithFormat:@"PARAMS: \n%@\n\n", jsonString]];
msg = [msg stringByAppendingString:[NSString stringWithFormat:@"%@\n\n %@\n", isSuccess, responseString]];
msg = [msg stringByAppendingString:end];
// 如果开启debug模式,会在主界面弹出每次请求的详情
CLog(@"%@", msg);
if (self.debugLogEnabled) {
WS(weakSelf);
[ZJShowLogView showWithLog:msg closeLog:^{
weakSelf.debugLogEnabled = NO;
}];
}
}
@end