HttpManager.m 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678
  1. //
  2. // HttpManager.m
  3. // TheoryNetwork
  4. //
  5. // Created by tederen on 2019/9/25.
  6. // Copyright © 2019 tederen. All rights reserved.
  7. //
  8. #import "HttpManager.h"
  9. @interface HttpManager ()
  10. @end
  11. @implementation HttpManager
  12. TDShareInstance_implementation(HttpManager)
  13. - (void)GET:(NSString *)URLString
  14. parameters:(nullable id)parameters
  15. success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success
  16. failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure {
  17. [self.manager GET:URLString parameters:parameters headers:@{@"Authorization":[UserManager token]} progress:nil success:success failure:failure];
  18. }
  19. - (void)POST:(NSString *)URLString
  20. parameters:(nullable id)parameters
  21. success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success
  22. failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure {
  23. [self.manager POST:URLString parameters:parameters headers:@{@"Authorization":[UserManager token]} progress:nil success:success failure:failure];
  24. }
  25. - (void)startRequestWithUrl:(NSString *)url method:(NSString *)method params:(NSDictionary *)params{
  26. NSError *error;
  27. NSData *jsonData = [NSJSONSerialization dataWithJSONObject:params options:0 error:&error];
  28. NSString *jsonString = [[NSString alloc]initWithData:jsonData encoding:NSUTF8StringEncoding];
  29. AFURLSessionManager *manager = [[AFURLSessionManager alloc]initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
  30. NSMutableURLRequest *request = [[AFJSONRequestSerializer serializer] requestWithMethod:method URLString:url parameters:nil error:nil];
  31. request.timeoutInterval = 30;
  32. [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
  33. [request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
  34. // manager.responseSerializer.acceptableContentTypes = [manager.responseSerializer.acceptableContentTypes setByAddingObject:@"text/plain"];
  35. [request setHTTPBody:[jsonString dataUsingEncoding:NSUTF8StringEncoding]];
  36. [[manager dataTaskWithRequest:request uploadProgress:^(NSProgress * _Nonnull uploadProgress) {
  37. } downloadProgress:^(NSProgress * _Nonnull downloadProgress) {
  38. } completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) {
  39. if (!error) {
  40. NSLog(@"Reply JOSN:%@",responseObject);
  41. }else{
  42. NSLog(@"ERROR:%@,%@,%@",error,response,responseObject);
  43. }
  44. }] resume] ;
  45. }
  46. - (void)DeleteWithUrl:(NSString *)url
  47. parameters:(NSDictionary *)parameters
  48. success:(void (^)(id responseObject))successful
  49. failure:(void (^) (NSError *error))failure{
  50. if (url.length==0) {
  51. return;
  52. }
  53. if (![url hasPrefix:@"http"]) {
  54. url = [BaseUrl stringByAppendingString:url];
  55. }
  56. [self DeleteUrl:url
  57. parameters:parameters
  58. responseStyle:JOSN
  59. success:successful
  60. failure:failure];
  61. }
  62. - (void)DeleteUrl:(NSString *)url
  63. parameters:(NSDictionary *)parameters
  64. success:(void (^)(id responseObject))successful
  65. failure:(void (^) (NSError *error))failure{
  66. [self DeleteUrl:url
  67. parameters:parameters
  68. responseStyle:JOSN
  69. success:successful
  70. failure:failure];
  71. }
  72. - (void)DeleteUrl:(NSString *)url
  73. parameters:(NSDictionary *)parameters
  74. responseStyle:(FWZRsponseStyle)style
  75. success:(void (^)(id responseObject))successful
  76. failure:(void (^) (NSError *error))failure {
  77. switch (style) {
  78. case JOSN:{
  79. self.manager.responseSerializer = [AFJSONResponseSerializer serializer];
  80. }break;
  81. case XML:{
  82. self.manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
  83. }break;
  84. case DATA:{
  85. self.manager.responseSerializer = [AFHTTPResponseSerializer serializer];
  86. }break;
  87. }
  88. NSError *error = nil;
  89. //判断接口是否是空值
  90. if (url.length == 0 || [url isEqualToString:@""]) {
  91. failure(error);
  92. }
  93. self.manager.requestSerializer.HTTPMethodsEncodingParametersInURI = [NSSet setWithObjects:@"GET", @"HEAD", nil];
  94. //开始请求内容
  95. [self.manager DELETE:url
  96. parameters:parameters
  97. headers:@{@"Authorization":[UserManager token]}
  98. success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
  99. [self reLoginApp:task];
  100. successful(responseObject);
  101. }
  102. failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
  103. [self reLoginApp:task];
  104. failure(error);
  105. }];
  106. }
  107. - (void)GETUrl:(NSString *)url
  108. parameters:(NSDictionary *)parameters
  109. success:(void (^)(id responseObject))successful
  110. failure:(void (^) (NSError *error))failure
  111. {
  112. [self GETUrl:url parameters:parameters responseStyle:JOSN success:successful failure:failure];
  113. }
  114. - (void)GETUrl:(NSString *)url
  115. parameters:(NSDictionary *)parameters
  116. responseStyle:(FWZRsponseStyle)style
  117. success:(void (^)(id responseObject))successful
  118. failure:(void (^) (NSError *error))failure {
  119. switch (style) {
  120. case JOSN:{
  121. self.manager.responseSerializer = [AFJSONResponseSerializer serializer];
  122. }break;
  123. case XML:{
  124. self.manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
  125. }break;
  126. case DATA:{
  127. self.manager.responseSerializer = [AFHTTPResponseSerializer serializer];
  128. }break;
  129. }
  130. NSError *error = nil;
  131. //判断接口是否是空值
  132. if (url.length == 0 || [url isEqualToString:@""]) {
  133. failure(error);
  134. }
  135. //开始请求内容
  136. [self.manager GET:url parameters:parameters headers:@{@"Authorization":[UserManager token]} progress:^(NSProgress * _Nonnull downloadProgress) {
  137. //如果需要填充进度内容,可以直接进行内容添加
  138. } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
  139. [self reLoginApp:task];
  140. successful(responseObject);
  141. } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
  142. [self reLoginApp:task];
  143. failure(error);
  144. }];
  145. }
  146. /// 只需要传 api url 即可
  147. - (void)GETWithUrl:(NSString *)url
  148. parameters:(NSDictionary *)parameters
  149. success:(void (^)(id responseObject))successful
  150. failure:(void (^) (NSError *error))failure{
  151. if (url.length==0) {
  152. return;
  153. }
  154. if (![url hasPrefix:@"http"]) {
  155. url = [BaseUrl stringByAppendingString:url];
  156. }
  157. [self GETUrl:url parameters:parameters responseStyle:JOSN success:successful failure:failure];
  158. }
  159. /**
  160.  POST请求接口
  161.  */
  162. /// 只需要传 api url 即可
  163. - (void)POSTWithUrl:(NSString *)url
  164. parameters:(NSDictionary *)parameters
  165. success:(void (^)(id responseObject))successful
  166. failure:(void (^) (NSError *error))failure{
  167. if (url.length==0) {
  168. return;
  169. }
  170. if (![url hasPrefix:@"http"]) {
  171. url = [BaseUrl stringByAppendingString:url];
  172. }
  173. [self POSTUrl:url parameters:parameters responseStyle:JOSN success:successful failure:failure];
  174. }
  175. //responseStyle:(responseStyle)style
  176. - (void)POSTUrl:(NSString *)url
  177. parameters:(NSDictionary *)parameters
  178. success:(void (^)(id responseObject))successful
  179. failure:(void (^) (NSError *error))failure
  180. {
  181. [self POSTUrl:url
  182. parameters:parameters
  183. responseStyle:DATA
  184. success:successful
  185. failure:failure];
  186. }
  187. - (void)POSTUrl:(NSString *)url
  188. parameters:(NSDictionary *)parameters
  189. responseStyle:(FWZRsponseStyle)style
  190. success:(void (^)(id responseObject))successful
  191. failure:(void (^) (NSError *error))failure
  192. {
  193. switch (style) {
  194. case JOSN:{
  195. self.manager.responseSerializer = [AFJSONResponseSerializer serializer];
  196. }break;
  197. case XML:{
  198. self.manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
  199. }break;
  200. case DATA:{
  201. self.manager.responseSerializer = [AFHTTPResponseSerializer serializer];
  202. }break;
  203. }
  204. NSError *error = nil;
  205. if (url.length == 0 || [url isEqualToString:@""]) { failure(error); }
  206. [self.manager POST:url parameters:parameters headers:@{@"Authorization":[UserManager token]} progress:^(NSProgress * _Nonnull downloadProgress) {
  207. } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
  208. [self reLoginApp:task];
  209. successful(responseObject);
  210. } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
  211. [self reLoginApp:task];
  212. failure(error);
  213. }];
  214. }
  215. /**
  216. 图片上传接口(上传音频与图片是一致的,需要更改的只是 mimeType类型,根据要求设置对应的格式即可)
  217. @param url 请求接口
  218. @param paramters 请求参数
  219. @param pictureData 图片数据
  220. @param pictureKey 与后台约定的 文件key
  221. @param successful 成功返回
  222. @param failure 失败返回
  223. */
  224. - (void)HeaderUploadUrl:(NSString *)url
  225. parameters:(NSDictionary *)paramters
  226. pictureData:(NSData *)pictureData
  227. pictureKey:(NSString *)pictureKey
  228. success:(void (^) (id responseObject))successful
  229. failure:(void (^) (NSError *error))failure
  230. {
  231. NSError *error = nil;
  232. //接口URL为空
  233. if (url.length == 0 || [url isEqualToString:@""] ) {
  234. failure(error);
  235. }
  236. // //传入参数为空
  237. // if ([ZYCTool isNullToDictionary:paramters]) {
  238. // failure(error);
  239. // }
  240. //传入上传图片数据为空(NSData)
  241. if (pictureData.length == 0) {
  242. failure(error);
  243. }
  244. //上传图片,服务器端文件名
  245. if (pictureKey.length == 0 || [pictureKey isEqualToString:@""]) {
  246. failure(error);
  247. }
  248. [self.manager POST:url parameters:paramters headers:@{@"Authorization":[UserManager token]} constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
  249. //对上传完文件的配置
  250. //获取当前时间(int 时间戳转换)
  251. int nowDate = [[NSString stringWithFormat:@"%ld",(long)[[NSDate date] timeIntervalSince1970]]intValue];
  252. NSString *fileName = [NSString stringWithFormat:@"%d.jpg",nowDate];
  253. //参数介绍
  254. //fileData : 图片资源 name : 预定key fileName : 文件名 mimeType : 资源类型(根据后台进行对应配置)
  255. [formData appendPartWithFileData:pictureData name:pictureKey fileName:fileName mimeType:@"image/jpeg"];
  256. } progress:^(NSProgress * _Nonnull uploadProgress) {
  257. //上传进度
  258. dispatch_sync(dispatch_get_main_queue(), ^{
  259. // progress ? progress(uploadProgress) : nil;
  260. });
  261. } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
  262. successful(responseObject);
  263. } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
  264. //可以将http响应码返回,以便于判断错误
  265. failure(error);
  266. }];
  267. }
  268. /**
  269. 图片上传接口(上传音频与图片是一致的,需要更改的只是 mimeType类型,根据要求设置对应的格式即可)
  270. @param url 请求接口
  271. @param paramters 请求参数
  272. @param array 图片数组
  273. @param pictureKey 与后台约定的 文件key
  274. @param successful 成功返回
  275. @param failure 失败返回
  276. */
  277. - (void)HeaderUploadUrl:(NSString *)url
  278. parameters:(NSDictionary *)paramters
  279. pictureArray:(NSArray *)array
  280. pictureKey:(NSString *)pictureKey
  281. success:(void (^) (id responseObject))successful
  282. failure:(void (^) (NSError *error))failure
  283. {
  284. NSError *error = nil;
  285. //接口URL为空
  286. if (url.length == 0 || [url isEqualToString:@""] ) {
  287. failure(error);
  288. }
  289. // //传入参数为空
  290. // if ([ZYCTool isNullToDictionary:paramters]) {
  291. // failure(error);
  292. // }
  293. //传入上传图片数据为空(NSData)
  294. if (array.count == 0) {
  295. failure(error);
  296. }
  297. //上传图片,服务器端文件名
  298. if (pictureKey.length == 0 || [pictureKey isEqualToString:@""]) {
  299. failure(error);
  300. }
  301. [self.manager POST:url parameters:paramters headers:@{@"Authorization":[UserManager token]} constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
  302. //对上传完文件的配置
  303. //获取当前时间(int 时间戳转换)
  304. for (NSInteger i = 0; i < array.count; i++) {
  305. int nowDate = [[NSString stringWithFormat:@"%ld",(long)[[NSDate date] timeIntervalSince1970]]intValue];
  306. NSString *fileName = [NSString stringWithFormat:@"%d%ld.jpg",nowDate,(long)i];
  307. //参数介绍
  308. //fileData : 图片资源 name : 预定key fileName : 文件名 mimeType : 资源类型(根据后台进行对应配置)
  309. [formData appendPartWithFileData:array[i] name:pictureKey fileName:fileName mimeType:@"image/jpeg"];
  310. }
  311. } progress:^(NSProgress * _Nonnull uploadProgress) {
  312. //上传进度
  313. dispatch_sync(dispatch_get_main_queue(), ^{
  314. // progress ? progress(uploadProgress) : nil;
  315. });
  316. } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
  317. [self reLoginApp:task];
  318. successful(responseObject);
  319. } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
  320. [self reLoginApp:task];
  321. //可以将http响应码返回,以便于判断错误
  322. failure(error);
  323. }];
  324. }
  325. - (void)HeaderUploadFileUrl:(NSString *)url
  326. parameters:(NSDictionary *)paramters
  327. fileData:(NSData *)fileData
  328. fileKey:(NSString *)fileKey
  329. fileName:(NSString *)fileName
  330. mimeType:(NSString *)mimeType
  331. success:(void (^) (id responseObject))successful
  332. failure:(void (^) (NSError *error))failure
  333. {
  334. NSError *error = nil;
  335. //接口URL为空
  336. if (url.length == 0 || [url isEqualToString:@""] ) {
  337. failure(error);
  338. }
  339. //传入上传图片数据为空(NSData)
  340. if (fileData.length == 0) {
  341. failure(error);
  342. }
  343. //上传图片,服务器端文件名
  344. if (fileKey.length == 0 || [fileKey isEqualToString:@""]) {
  345. failure(error);
  346. }
  347. self.manager.responseSerializer = [AFJSONResponseSerializer serializer];
  348. [self.manager POST:url parameters:paramters headers:@{@"Authorization":[UserManager token]} constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
  349. //fileData : 图片资源 name : 预定key fileName : 文件名 mimeType : 资源类型(根据后台进行对应配置)
  350. [formData appendPartWithFileData:fileData name:fileKey fileName:fileName mimeType:mimeType];
  351. } progress:^(NSProgress * _Nonnull uploadProgress) {
  352. //上传进度
  353. dispatch_sync(dispatch_get_main_queue(), ^{
  354. // progress ? progress(uploadProgress) : nil;
  355. });
  356. } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
  357. [self reLoginApp:task];
  358. successful(responseObject);
  359. } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
  360. [self reLoginApp:task];
  361. //可以将http响应码返回,以便于判断错误
  362. failure(error);
  363. }];
  364. }
  365. //
  366. //
  367. ///**
  368. // 下载文件接口
  369. //
  370. // @param url 请求接口
  371. // @param progress 下载进度
  372. // @param downloadFilePath 文件保存路径
  373. // @param successful  返回路径内容
  374. // @param failure 失败返回
  375. // */
  376. //- (void)downloadUrl:(NSString *)url
  377. //           progress:(HttpProgress)progress
  378. //   downloadFilePath:(NSString *)downloadFilePath
  379. //            success:(void (^) (id responseObject))successful
  380. //            failure:(void (^) (NSError *error, ParamtersJudgeCode  judgeCode))failure;
  381. //
  382. //
  383. //
  384. ///**
  385. // 下载文件接口
  386. // @param url 请求接口
  387. // @param progress 下载进度
  388. // @param downloadFilePath 文件保存路径
  389. // @param successful  返回路径内容
  390. // @param failure 失败返回
  391. // */
  392. //- (void)downloadUrl:(NSString *)url
  393. //        progress:(HttpProgress)progress
  394. //        downloadFilePath:(NSString *)downloadFilePath
  395. //        success:(void (^) (id responseObject))successful
  396. //        failure:(void (^) (NSError *error, ParamtersJudgeCode  judgeCode))failure
  397. //  {
  398. //    //下载地址
  399. //    NSURL *downloadURL = [NSURL URLWithString:url];
  400. //    //设置请求
  401. //    NSURLRequest *request = [NSURLRequest requestWithURL:downloadURL];
  402. //    //下载操作
  403. //    [_sessionManager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {
  404. //        //下载进度
  405. //        dispatch_sync(dispatch_get_main_queue(), ^{
  406. //            progress ? progress(downloadProgress) : nil;
  407. //        });
  408. //
  409. //    } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
  410. //        //拼接缓存目录
  411. //        NSString *downloadPath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:downloadFilePath ? downloadFilePath : @"Download"];
  412. //        //打开文件管理器
  413. //        NSFileManager *fileManager = [NSFileManager defaultManager];
  414. //        //创建Download目录
  415. //        [fileManager createDirectoryAtPath:downloadPath withIntermediateDirectories:YES attributes:nil error:nil];
  416. //        //拼接文件路径
  417. //        NSString *filePath = [downloadPath stringByAppendingPathComponent:response.suggestedFilename];
  418. //        //返回文件位置的URL路径
  419. //        return [NSURL fileURLWithPath:filePath];
  420. //    } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
  421. //        NSInteger responseCode = [self showResponseCode:response];
  422. //        if (responseCode != 200) {
  423. //            successful ? successful(filePath.absoluteString): nil;
  424. //        }else {
  425. //            failure(error, UploadFailed);
  426. //        }
  427. //    }];
  428. //}
  429. //
  430. - (void)downloadUrl:(NSString *)url
  431. downloadFilePath:(NSString *)downloadFilePath
  432. success:(void (^) (id responseObject))successful
  433. failure:(void (^) (NSError *error))failure
  434. {
  435. //下载地址
  436. NSURL *downloadURL = [NSURL URLWithString:url];
  437. //设置请求
  438. NSURLRequest *request = [NSURLRequest requestWithURL:downloadURL];
  439. //下载操作
  440. [_manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {
  441. } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
  442. //拼接缓存目录
  443. NSString *downloadPath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:downloadFilePath ? downloadFilePath : @"Download"];
  444. //打开文件管理器
  445. NSFileManager *fileManager = [NSFileManager defaultManager];
  446. //创建Download目录
  447. [fileManager createDirectoryAtPath:downloadPath withIntermediateDirectories:YES attributes:nil error:nil];
  448. //拼接文件路径
  449. NSString *filePath = [downloadPath stringByAppendingPathComponent:response.suggestedFilename];
  450. //返回文件位置的URL路径
  451. return [NSURL fileURLWithPath:filePath];
  452. } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
  453. failure(error);
  454. }];
  455. }
  456. //
  457. //
  458. ///**
  459. // POST请求接口
  460. // */
  461. //
  462. //
  463. //- (void)POSTUrl:(NSString *)url parameters:(NSDictionary *)parameters success:(void (^)(id responseObject))successful
  464. //failure:(void (^) (NSError *error))failure
  465. //{
  466. // NSError *error = nil;
  467. // if (url.length == 0 || [url isEqualToString:@""]) {
  468. // failure(error);
  469. // }
  470. // [self.manager POST:url parameters:parameters progress:^(NSProgress * _Nonnull downloadProgress) {
  471. //
  472. // } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
  473. // successful(responseObject);
  474. //
  475. // } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
  476. // failure(error);
  477. // }];
  478. //
  479. //}
  480. - (void)PUTUrl:(NSString *)url parameters:(NSDictionary *)parameters success:(void (^)(id responseObject))successful
  481. failure:(void (^) (NSError *error))failure{
  482. self.manager.responseSerializer = [AFHTTPResponseSerializer serializer];
  483. NSError *error = nil;
  484. if (url.length == 0 || [url isEqualToString:@""]) {
  485. failure(error);
  486. }
  487. NSLog(@"url:%@",url);
  488. [self.manager PUT:url parameters:parameters headers:@{@"Authorization":[UserManager token]} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
  489. [self reLoginApp:task];
  490. successful(responseObject);
  491. } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
  492. [self reLoginApp:task];
  493. failure(error);
  494. }];
  495. }
  496. - (void)PUTUrl:(NSString *)url
  497. parameters:(NSDictionary *)parameters
  498. responseStyle:(FWZRsponseStyle)style
  499. success:(void (^)(id responseObject))successful
  500. failure:(void (^) (NSError *error))failure
  501. {
  502. switch (style) {
  503. case JOSN:{
  504. self.manager.responseSerializer = [AFJSONResponseSerializer serializer];
  505. }break;
  506. case XML:{
  507. self.manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
  508. }break;
  509. case DATA:{
  510. self.manager.responseSerializer = [AFHTTPResponseSerializer serializer];
  511. }break;
  512. }
  513. NSError *error = nil;
  514. if (url.length == 0 || [url isEqualToString:@""]) { failure(error); }
  515. [self.manager PUT:url parameters:parameters headers:@{@"Authorization":[UserManager token]} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
  516. [self reLoginApp:task];
  517. successful(responseObject);
  518. } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
  519. [self reLoginApp:task];
  520. failure(error);
  521. }];
  522. }
  523. +(NSURLSessionUploadTask*)uploadTaskUrl:(NSURL*)uploadPage params:(NSDictionary*)params files:(NSArray<NSDictionary<NSString*,id>*>*)fileDatas completion:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionBlock {
  524. NSLog(@"url %@\nparam %@",uploadPage,params);
  525. NSError* error = NULL;
  526. NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:[uploadPage absoluteString] parameters:params constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
  527. for (int i=0; i<fileDatas.count; i++) {
  528. NSDictionary* unitData = fileDatas[i];
  529. if (unitData && [unitData objectForKey:@"key"] && [unitData objectForKey:@"filename"] && [unitData objectForKey:@"data"]) {
  530. if ([[unitData objectForKey:@"data"] isKindOfClass:[NSData class]]) {
  531. [formData appendPartWithFileData:(NSData*)[unitData objectForKey:@"data"] name:[unitData objectForKey:@"key"] fileName:[unitData objectForKey:@"filename"] mimeType:@"multipart/form-data"];
  532. }else if([[unitData objectForKey:@"data"] isKindOfClass:[NSURL class]]){
  533. [formData appendPartWithFileURL:(NSURL*)[unitData objectForKey:@"data"] name:[unitData objectForKey:@"key"] fileName:[unitData objectForKey:@"filename"] mimeType:@"multipart/form-data" error:nil];
  534. }
  535. }
  536. }
  537. } error:&error];
  538. NSLog(@"error %@",error);
  539. // 将 NSURLRequest 与 completionBlock 包装为 NSURLSessionUploadTask
  540. AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
  541. manager.responseSerializer = [AFHTTPResponseSerializer serializer];
  542. NSURLSessionUploadTask *uploadTask = [manager uploadTaskWithStreamedRequest:request progress:^(NSProgress * _Nonnull uploadProgress) {
  543. } completionHandler:completionBlock];
  544. return uploadTask;
  545. }
  546. #pragma mark - setter
  547. - (AFHTTPSessionManager *)manager {
  548. if (!_manager) {
  549. // 判断是否有请求基础url
  550. if ([self baseUrl].length) {
  551. _manager = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:[self baseUrl]]];
  552. } else {
  553. _manager = [AFHTTPSessionManager manager];
  554. }
  555. _manager.requestSerializer = [AFJSONRequestSerializer serializer];
  556. // _manager.responseSerializer = [AFJSONResponseSerializer serializer];
  557. _manager.responseSerializer = [AFHTTPResponseSerializer serializer];
  558. _manager.requestSerializer.stringEncoding = NSUTF8StringEncoding;
  559. //设置token
  560. [_manager.requestSerializer setValue:[UserManager token] forHTTPHeaderField:@"Authorization"];
  561. // 接收请求类型
  562. _manager.responseSerializer.acceptableContentTypes = [NSSet setWithArray:@[@"application/json",
  563. @"text/html",
  564. @"text/json",
  565. @"text/plain",
  566. @"text/javascript",
  567. @"text/xml",
  568. @"image/*"]];
  569. // 设置请求超时
  570. _manager.requestSerializer.timeoutInterval = 30.f;
  571. // 设置允许同时最大并发数量,过大容易出问题
  572. _manager.operationQueue.maxConcurrentOperationCount = 10;
  573. _manager.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
  574. _manager.securityPolicy.validatesDomainName = NO;
  575. _manager.securityPolicy.allowInvalidCertificates = YES;
  576. }
  577. return _manager;
  578. }
  579. - (NSString *)baseUrl {
  580. return BaseUrl;
  581. }
  582. - (void)cancelRequest
  583. {
  584. if ([_manager.tasks count] > 0) {
  585. NSLog(@"返回时取消网络请求");
  586. [_manager.tasks makeObjectsPerformSelector:@selector(cancel)];
  587. //NSLog(@"tasks = %@",manager.tasks);
  588. }
  589. }
  590. - (void)reLoginApp:(NSURLSessionDataTask *)task
  591. {
  592. NSHTTPURLResponse *response = (NSHTTPURLResponse*)task.response;
  593. NSInteger statusCode = response.statusCode;
  594. if (statusCode == 401) {
  595. [self changeToLogin];
  596. }
  597. }
  598. -(void)changeToLogin{
  599. [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"LOGINTOKEN"];
  600. [[NSUserDefaults standardUserDefaults] synchronize];
  601. [[EMClient sharedClient] logout:YES completion:^(EMError *aError) {
  602. [[HttpManager sharedHttpManager].manager.requestSerializer setValue:@"" forHTTPHeaderField:@"Authorization"];
  603. UIWindow *window = [UtilsTools getWindow];
  604. window.rootViewController = [StoryboardManager shared].login.instantiateInitialViewController;
  605. [window makeKeyAndVisible];
  606. }];
  607. }
  608. @end