NetHttpsManager.m 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444
  1. //
  2. // NetHttpsManager.m
  3. // BuguLive
  4. //
  5. // Created by xfg on 2017/3/13.
  6. // Copyright © 2017年 xfg. All rights reserved.
  7. //
  8. #import "NetHttpsManager.h"
  9. #import "AFNetworking.h"
  10. #import "ApiLinkModel.h"
  11. #import "GTMBase64.h"
  12. #import "AFHTTPSessionManager+Singlton.h"
  13. #define kOvertime 180 // 请求超时时间
  14. @implementation NetHttpsManager
  15. + (instancetype)manager
  16. {
  17. return [[NetHttpsManager alloc] init];
  18. }
  19. #pragma mark - ----------------------- 请求网络方法 -----------------------
  20. /**
  21. POST异步请求方法一
  22. @param paramDict 请求参数
  23. @param PostSuccess 成功回调
  24. @param PostFailure 失败回调
  25. */
  26. - (void)POSTWithParameters:(NSMutableDictionary *)paramDict SuccessBlock:(SuccessBlock)PostSuccess FailureBlock:(FailureBlock)PostFailure
  27. {
  28. [self POSTWithUrl:[NetWorkManager getUrlStr:paramDict] paramDict:paramDict SuccessBlock:PostSuccess FailureBlock:PostFailure];
  29. }
  30. /**
  31. POST异步请求方法二
  32. @param urlStr 接口基本地址
  33. @param paramDict 请求参数
  34. @param PostSuccess 成功回调
  35. @param PostFailure 失败回调
  36. */
  37. - (void)POSTWithUrl:(NSString *)urlStr paramDict:(NSMutableDictionary *)paramDict SuccessBlock:(SuccessBlock)PostSuccess FailureBlock:(FailureBlock)PostFailure
  38. {
  39. paramDict = [NetWorkManager getLocalParm:paramDict url:urlStr];
  40. if (![NetWorkManager isExistenceNetwork])
  41. {
  42. NSLog(ASLocalizedString(@"请检查当前网络"));
  43. }
  44. else
  45. {
  46. [NetWorkManager myCookieStorage];
  47. AFHTTPSessionManager *manager = [AFHTTPSessionManager defaultNetManager];
  48. manager.requestSerializer.timeoutInterval = kOvertime;
  49. [manager POST:urlStr parameters:paramDict headers:nil progress:^(NSProgress * _Nonnull uploadProgress) {
  50. } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
  51. // NSLog(@"responseObject");
  52. // NSLog(@"%@",responseObject);
  53. [NetWorkManager doResult:responseObject url:urlStr paramDict:paramDict successBlock:PostSuccess successBlock2:nil failureBlock:PostFailure failureBlock2:nil];
  54. } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
  55. [NetWorkManager updateErrorToServiceWithUrl:urlStr paramDict:paramDict errorString:[NSString stringWithFormat:@"%@",error]];
  56. if (PostFailure)
  57. {
  58. PostFailure(error);
  59. }
  60. }];
  61. }
  62. }
  63. /**
  64. POST异步请求方法三,带文件
  65. @param parmDict 请求参数
  66. @param fileUrl 文件的url,流传输方式
  67. @param PostSuccess 成功回调
  68. @param PostFailure 失败回调
  69. */
  70. - (void)POSTWithDict:(NSMutableDictionary *)parmDict andFileUrl:(NSURL *)fileUrl SuccessBlock:(SuccessBlock)PostSuccess FailureBlock:(FailureBlock)PostFailure
  71. {
  72. NSString *urlStr = [NetWorkManager getUrlStr:parmDict];
  73. parmDict = [NetWorkManager getLocalParm:parmDict url:urlStr];
  74. if (![NetWorkManager isExistenceNetwork])
  75. {
  76. NSLog(ASLocalizedString(@"请检查当前网络"));
  77. }
  78. else
  79. {
  80. [NetWorkManager myCookieStorage];
  81. AFHTTPSessionManager *manager = [AFHTTPSessionManager defaultNetManager];
  82. [manager POST:urlStr parameters:parmDict headers:nil constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData){
  83. [formData appendPartWithFileURL:fileUrl name:@"file" error:nil];
  84. } progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject){
  85. [NetWorkManager doResult:responseObject url:urlStr paramDict:parmDict successBlock:PostSuccess successBlock2:nil failureBlock:PostFailure failureBlock2:nil];
  86. } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
  87. [NetWorkManager updateErrorToServiceWithUrl:urlStr paramDict:parmDict errorString:[NSString stringWithFormat:@"%@",error]];
  88. if (PostFailure)
  89. {
  90. PostFailure(error);
  91. }
  92. }];
  93. }
  94. }
  95. /**
  96. POST异步请求方法四,带接口名字的方式
  97. @param method act
  98. @param ctl ctl
  99. @param param 请求参数
  100. @param successBlock 成功回调
  101. @param failBlock 失败回调
  102. */
  103. - (void)postMethod:(NSString*)method ctl:(NSString*)ctl param:(NSDictionary*)param successBlock:(SuccessBlock)successBlock failBlock:(FailureBlock)failBlock
  104. {
  105. NSMutableDictionary* postdir = NSMutableDictionary.new;
  106. if(param)
  107. {
  108. [postdir setDictionary:param];
  109. }
  110. [postdir setObject:method forKey:@"act"];
  111. [postdir setObject:ctl forKey:@"ctl"];
  112. [self POSTWithParameters:postdir SuccessBlock:successBlock FailureBlock:failBlock];
  113. }
  114. /**
  115. GET异步请求
  116. @param urlStr 接口基本地址
  117. @param headers headers
  118. @param GetSuccess 成功回调
  119. @param GetFailure 失败回调
  120. */
  121. - (void)GETWithUrl:(NSString *)urlStr headers:(NSMutableDictionary *)headers SuccessBlock:(SuccessBlock)GetSuccess FailureBlock:(FailureBlock)GetFailure
  122. {
  123. if (![NetWorkManager isExistenceNetwork])
  124. {
  125. NSLog(ASLocalizedString(@"请检查当前网络"));
  126. }
  127. else
  128. {
  129. AFHTTPSessionManager *manager;
  130. NSURL *baseURL = [NSURL URLWithString:urlStr];
  131. if (headers)
  132. {
  133. //设置和加入头信息
  134. NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
  135. [config setHTTPAdditionalHeaders:headers];
  136. manager = [[AFHTTPSessionManager alloc] initWithBaseURL:baseURL sessionConfiguration:config];
  137. }
  138. else
  139. {
  140. manager = [[AFHTTPSessionManager alloc]initWithBaseURL:baseURL];
  141. }
  142. manager.requestSerializer = [AFHTTPRequestSerializer serializer];
  143. manager.responseSerializer =[AFHTTPResponseSerializer serializer];
  144. manager.requestSerializer.timeoutInterval = kOvertime;
  145. [manager GET:urlStr parameters:[NetWorkManager getLocalParm:[NSMutableDictionary dictionary] url:urlStr] headers:nil progress:^(NSProgress * _Nonnull downloadProgress) {
  146. } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
  147. [NetWorkManager doResult:responseObject url:urlStr paramDict:nil successBlock:GetSuccess successBlock2:nil failureBlock:GetFailure failureBlock2:nil];
  148. } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
  149. if (GetFailure)
  150. {
  151. GetFailure(error);
  152. }
  153. }];
  154. }
  155. }
  156. /**
  157. NSURLSession同步请求
  158. @param urlStr 接口基本地址
  159. @param parmDict 请求参数
  160. @param PostSuccess 成功回调
  161. @param PostFailure 失败回调
  162. */
  163. - (void)syncPostWithUrl:(NSString *)urlStr parameters:(NSMutableDictionary *)parmDict SuccessBlock:(SuccessBlock)PostSuccess FailureBlock:(FailureBlock)PostFailure
  164. {
  165. dispatch_semaphore_t semaphore = dispatch_semaphore_create(10000); //创建信号量
  166. NSURL *url = [NSURL URLWithString:urlStr];
  167. //(1)构造Request
  168. NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
  169. //(2)设置为POST请求
  170. [request setHTTPMethod:@"POST"];
  171. //(3)超时
  172. [request setTimeoutInterval:kOvertime];
  173. //(4)设置请求头
  174. //[request setAllHTTPHeaderFields:nil];
  175. //(5)设置请求体
  176. NSMutableString *params = nil;
  177. if(nil != parmDict)
  178. {
  179. params = [[NSMutableString alloc] init];
  180. for(id key in parmDict)
  181. {
  182. NSString *encodedkey = [key stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
  183. CFStringRef value = (__bridge CFStringRef)[[parmDict objectForKey:key] copy];
  184. CFStringRef encodedValue = CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, value,NULL,(CFStringRef)@";/?:@&=+$", kCFStringEncodingUTF8);
  185. [params appendFormat:@"%@=%@&", encodedkey, encodedValue];
  186. CFRelease(value);
  187. CFRelease(encodedValue);
  188. }
  189. [params deleteCharactersInRange:NSMakeRange([params length] - 1, 1)];
  190. }
  191. NSData *bodyData = [params dataUsingEncoding:NSUTF8StringEncoding];
  192. // if (bodyData)
  193. // {
  194. // [request setValue:[NSString stringWithFormat:@"%ld",(long)[bodyData length]] forHTTPHeaderField:@"Content-Length"];
  195. // [request setHTTPMethod:@"POST"];
  196. // [request setValue:@"application/json; charset=UTF-8" forHTTPHeaderField:@"Content-Type"];
  197. // [request setValue:@"gzip" forHTTPHeaderField:@"Accept-Encoding"];
  198. [request setHTTPBody:bodyData];
  199. // }
  200. //(6)构造Session
  201. NSURLSession *session = [NSURLSession sharedSession];
  202. //(7)task
  203. __block NSDictionary *resposeDict = nil;
  204. __block NSError *tmperror = nil;
  205. NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
  206. resposeDict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
  207. NSLog(@"dict:%@",resposeDict);
  208. tmperror = error;
  209. dispatch_semaphore_signal(semaphore); //发送信号
  210. }];
  211. [task resume];
  212. dispatch_semaphore_wait(semaphore,DISPATCH_TIME_FOREVER); //等待
  213. if (!tmperror)
  214. {
  215. if (resposeDict)
  216. {
  217. if([resposeDict count])
  218. {
  219. if (PostSuccess!=nil) {
  220. PostSuccess(resposeDict);
  221. }
  222. }
  223. else
  224. {
  225. if (PostFailure!=nil)
  226. {
  227. PostFailure(tmperror);
  228. }
  229. }
  230. }
  231. else
  232. {
  233. if (PostFailure!=nil)
  234. {
  235. PostFailure(tmperror);
  236. }
  237. }
  238. }
  239. else
  240. {
  241. if (PostFailure!=nil)
  242. {
  243. PostFailure(tmperror);
  244. }
  245. }
  246. }
  247. /**
  248. 同步 调用接口,不要在主线程调用
  249. @param method act
  250. @param ctl ctl
  251. @param param 请求参数
  252. @return 返回NSDictionary值
  253. */
  254. - (NSDictionary *)postSynchMehtod:(NSString*)method ctl:(NSString*)ctl param:(NSDictionary*)param
  255. {
  256. MYNSCondition* itlock = [[MYNSCondition alloc] init];//搞个事件来同步下
  257. __block NSDictionary* itret = nil;
  258. [self postMethod:method ctl:ctl param:param successBlock:^(NSDictionary *jsonData) {
  259. itret = jsonData;
  260. [itlock lock];
  261. [itlock signal];//设置事件,下面那个等待就可以收到事件返回了
  262. [itlock unlock];
  263. } failBlock:^(NSError *error) {
  264. NSLog(@"postSynchMehtod eror:%@",error);
  265. [itlock lock];
  266. [itlock signal];//设置事件,下面那个等待就可以收到事件返回了
  267. [itlock unlock];
  268. }];
  269. [itlock lock];//启动AFNETWORKING之后就等待事件
  270. [itlock wait];
  271. [itlock unlock];
  272. return itret;
  273. }
  274. /**
  275. POST异步请求方法三,带文件
  276. @param parmDict 请求参数
  277. @param fileUrl 文件的url,流传输方式
  278. @param PostSuccess 成功回调
  279. @param PostFailure 失败回调
  280. */
  281. - (void)POSTWithDict:(NSMutableDictionary *)parmDict andFileData:(NSData *)fileData AndFileName:(NSString *)fileName SuccessBlock:(SuccessBlock)PostSuccess FailureBlock:(FailureBlock)PostFailure
  282. {
  283. NSString *urlStr = [NetWorkManager getUrlStr:parmDict];
  284. parmDict = [NetWorkManager getLocalParm:parmDict url:urlStr];
  285. if (![NetWorkManager isExistenceNetwork])
  286. {
  287. NSLog(ASLocalizedString(@"请检查当前网络"));
  288. }
  289. else
  290. {
  291. [NetWorkManager myCookieStorage];
  292. AFHTTPSessionManager *manager = [AFHTTPSessionManager defaultNetManager];
  293. manager.requestSerializer.timeoutInterval = 600.f;
  294. [manager POST:urlStr parameters:parmDict headers:nil constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData){
  295. [formData appendPartWithFileData:fileData name:@"file" fileName:fileName mimeType:@"multipart/form-data"];
  296. // [formData appendPartWithFileURL:fileUrl name:@"file" error:nil];
  297. } progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject){
  298. [NetWorkManager doResult:responseObject url:urlStr paramDict:parmDict successBlock:PostSuccess successBlock2:nil failureBlock:PostFailure failureBlock2:nil];
  299. } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
  300. [NetWorkManager updateErrorToServiceWithUrl:urlStr paramDict:parmDict errorString:[NSString stringWithFormat:@"%@",error]];
  301. if (PostFailure)
  302. {
  303. PostFailure(error);
  304. }
  305. }];
  306. }
  307. }
  308. @end
  309. #pragma mark - ----------------------- MYNSCondition -----------------------
  310. // 重新NSCondition,原因:如果wait类函数后于signal调用,就会一直等待,也就是说signal线程比wait快执行
  311. @implementation MYNSCondition
  312. {
  313. __volatile int _waitcounts;
  314. }
  315. - (void)wait
  316. {
  317. _waitcounts += 1;
  318. if(_waitcounts <= 0)
  319. {
  320. return; // 本来一进入应该是等于1的,如果其他地方已经有signal了,就直接返回了
  321. }
  322. [super wait];
  323. }
  324. - (BOOL)waitUntilDate:(NSDate *)limit
  325. {
  326. _waitcounts += 1;
  327. if(_waitcounts <= 0)
  328. {
  329. return YES; // 本来一进入应该是等于1的,如果其他地方已经有signal了,就直接返回了
  330. }
  331. return [super waitUntilDate:limit];
  332. }
  333. - (void)signal
  334. {
  335. [super signal];
  336. _waitcounts -= 1;
  337. }
  338. - (void)broadcast
  339. {
  340. [super broadcast];
  341. _waitcounts = -1;
  342. }
  343. @end