NetworkUtils.m 53 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339
  1. //
  2. // NetworkUtils.m
  3. // AntsContract
  4. //
  5. // Created by Ray on 12/26/16.
  6. // Copyright © 2016 United Software Applications, Inc. All rights reserved.
  7. //
  8. #import "NetworkUtils.h"
  9. #import "RAUtils.h"
  10. #import "Reachability.h"
  11. #import "RANetworkTaskDelegate.h"
  12. #import "common_const.h"
  13. #import "config.h"
  14. #define BOUNDARY @"AaB03x"
  15. @implementation NetworkUtils
  16. //+(NSDictionary*) error_dict:(NSError*)error
  17. //{
  18. // if(error==nil)
  19. // return nil;
  20. // NSMutableDictionary* ret = [[NSMutableDictionary alloc] init];
  21. // [ret setValue:[NSString stringWithFormat:@"%d",error.code] forKey:@"error_code"];
  22. // [ret setValue:error.domain forKey:@"err_domain"];
  23. // [ret setValue:[error localizedDescription] forKey:@"err_message"];
  24. // // [ret setObject:error.userInfo forKey:@"user_info"];
  25. // return ret;
  26. //}
  27. +(bool) IsNetworkAvailable
  28. {
  29. if (([Reachability reachabilityForInternetConnection].currentReachabilityStatus == NotReachable)
  30. /* &&
  31. ([Reachability reachabilityForLocalWiFi].currentReachabilityStatus == NotReachable)*/)
  32. return false;
  33. return true;
  34. }
  35. +(NSData*)get_json : (NSString*) url parameters:(NSMutableDictionary *) params file:(NSString*)file_path err_recorder:(NSString* )recorder_url result_handler:(resultBlock)resultBlock decrypt_handler:(decryptBlock)decryptBlock
  36. {
  37. // int retry = 0;
  38. NSAssert(false, @"The get_json is obsolete, use the request_interface instead");
  39. return nil;
  40. //
  41. //repeat:
  42. // {
  43. //
  44. // // return [self fake_json:url];
  45. //
  46. // // AppDelegate *appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
  47. // //分界线的标识符
  48. // NSString *TWITTERFON_FORM_BOUNDARY = @"AaB03x";
  49. // //根据url初始化request
  50. // NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]
  51. // cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
  52. // timeoutInterval:JSON_TIMEOUT];
  53. //
  54. // //分界线 --AaB03x
  55. // NSString *MPboundary=[[NSString alloc]initWithFormat:@"--%@",TWITTERFON_FORM_BOUNDARY];
  56. // //结束符 AaB03x--
  57. // NSString *endMPboundary=[[NSString alloc]initWithFormat:@"%@--",MPboundary];
  58. // //要上传的图片
  59. // // UIImage *image=[params objectForKey:@"pic"];
  60. // //得到图片的data
  61. // NSData* data = [NSData dataWithContentsOfFile:file_path];
  62. // //http body的字符串
  63. // NSMutableString *body=[[NSMutableString alloc]init];
  64. //
  65. // // NSMutableDictionary* params = [[NSMutableDictionary alloc] init];
  66. // // [params setValue:@"handset_login" forKey:@"action"];
  67. // // [headers setValue:[NSString stringWithFormat:@"%d",dataLength] forKey:@"Content-Length"];
  68. //
  69. // // [params setValue:appDelegate.sessionid forKey:@"sessionid"];
  70. // // [params setValue:password forKey:@"password"];
  71. // // [params setValue:[NSString stringWithFormat:@"%d",ver] forKey:@"auth_ver"];
  72. //
  73. //
  74. //
  75. // // [headers setValue:headQuerlString forKey:@"param"];
  76. //
  77. // //参数的集合的所有key的集合
  78. // NSArray *keys= [params allKeys];
  79. // DebugLog(@"================parms==================");
  80. // //遍历keys
  81. // for(int i=0;i<[keys count];i++)
  82. // {
  83. // //得到当前key
  84. // NSString *key=[keys objectAtIndex:i];
  85. // //如果key不是pic,说明value是字符类型,比如name:Boris
  86. // if(![key isEqualToString:@"pic"])
  87. // {
  88. // //添加分界线,换行
  89. // [body appendFormat:@"%@\r\n",MPboundary];
  90. // //添加字段名称,换2行
  91. // [body appendFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n",key];
  92. // //添加字段的值
  93. // [body appendFormat:@"%@\r\n",[params objectForKey:key]];
  94. // DebugLog(@"parameter: key=%@ value=%@",key,[params objectForKey:key]);
  95. // }
  96. // }
  97. // DebugLog(@"================parms==================");
  98. // ////添加分界线,换行
  99. // [body appendFormat:@"%@\r\n",MPboundary];
  100. // //声明pic字段,文件名为boris.png
  101. //
  102. // NSString * file_format=[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"upfile\"; filename=\"%@\"\r\n", [file_path lastPathComponent]];
  103. //
  104. //
  105. //
  106. // [body appendFormat:@"%@", file_format];
  107. // //声明上传文件的格式
  108. // [body appendFormat:@"Content-Type: application/zip\r\n\r\n"];
  109. //
  110. // //声明结束符:--AaB03x--
  111. // NSString *end=[[NSString alloc]initWithFormat:@"\r\n%@",endMPboundary];
  112. // //声明myRequestData,用来放入http body
  113. // NSMutableData *myRequestData=[NSMutableData data];
  114. // //将body字符串转化为UTF8格式的二进制
  115. // [myRequestData appendData:[body dataUsingEncoding:NSUTF8StringEncoding]];
  116. // //将image的data加入
  117. // [myRequestData appendData:data];
  118. // //加入结束符--AaB03x--
  119. // [myRequestData appendData:[end dataUsingEncoding:NSUTF8StringEncoding]];
  120. //
  121. // //设置HTTPHeader中Content-Type的值
  122. // NSString *content=[[NSString alloc]initWithFormat:@"multipart/form-data; boundary=%@",TWITTERFON_FORM_BOUNDARY];
  123. // //设置HTTPHeader
  124. // [request setValue:content forHTTPHeaderField:@"Content-Type"];
  125. //
  126. // [request setValue:@"multipart/form-data" forHTTPHeaderField:@"enctype"];
  127. //
  128. // // 关闭keep alive
  129. // [request setValue:@"close" forHTTPHeaderField:@"Connection"];
  130. // //设置Content-Length
  131. // [request setValue:[NSString stringWithFormat:@"%lu", (unsigned long)[myRequestData length]] forHTTPHeaderField:@"Content-Length"];
  132. // //设置http body
  133. // [request setHTTPBody:myRequestData];
  134. // //http method
  135. // [request setHTTPMethod:@"POST"];
  136. //
  137. // NSLog(@"%@", [[NSString alloc] initWithData:myRequestData encoding:NSUTF8StringEncoding]);
  138. // NSHTTPURLResponse* urlResponse = nil;
  139. //
  140. // NSError *error = nil;
  141. // NSLog(@"begin request %@",url);
  142. //
  143. // NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&error];
  144. //
  145. //
  146. // DebugLog(@"url: %@",url);
  147. //
  148. // DebugLog(@"response: %@",[NSHTTPURLResponse localizedStringForStatusCode:urlResponse.statusCode]);
  149. //
  150. //
  151. // NSLog(@"get response");
  152. // if (responseData==nil) {
  153. //
  154. // // DebugLog(@"response error:%@", [error localizedDescription]);
  155. //
  156. //
  157. // NSMutableDictionary* ret = [[NSMutableDictionary alloc] init];
  158. // //#define RESULT_FALSE 0
  159. // //#define RESULT_TRUE 2
  160. // //#define RESULT_NET_ERROR -3
  161. // //#define RESULT_NET_NOTAVAILABLE -4
  162. // //#define RESULT_ERROR -5
  163. // //#define RESULT_LOCALFILE_ERROR -7
  164. // //#define RESULT_USERAUTH_ERROR -9
  165. // //#define RESULT_UPDATE_USERAUTH_ERROR -11
  166. // //#define RESULT_SESSION_EXPIRED -13
  167. // //#define RESULT_VER_LOW
  168. //
  169. // // NSString * moreinfo = error.description ;
  170. //
  171. // NSString* err_msg = [error localizedDescription];
  172. //
  173. //
  174. // //-----------------retry 3 times for error code -1005------------------------
  175. // if(error.code==-1005&&retry<3)
  176. // {
  177. // retry++;
  178. // goto repeat;
  179. //
  180. // }
  181. // //-----------------end retry 3 times for error code -1005------------------------
  182. //
  183. // NSDictionary* error_json = [RAUtils error_dict:error];
  184. // [ret setObject:error_json forKey:@"err_obj"];
  185. // NSString* resp_msg= nil;
  186. //
  187. // if(err_msg.length==0)
  188. // {
  189. // err_msg =[NSHTTPURLResponse localizedStringForStatusCode:urlResponse.statusCode];
  190. // resp_msg = err_msg;
  191. // }
  192. // [ret setValue:[NSString stringWithFormat:@"%d",RESULT_NET_ERROR] forKey:@"result"];
  193. // [ret setValue:err_msg forKey:@"err_msg"];
  194. // [ret setValue:resp_msg forKey:@"resp_msg"];
  195. // [ret setValue:[NSString stringWithFormat:@"%ld",(long)urlResponse.statusCode] forKey:@"resp_code"];
  196. //
  197. //
  198. // NSData *jsonData = [NSJSONSerialization dataWithJSONObject:ret
  199. // options:0
  200. // error:nil];
  201. // if(![url isEqualToString:recorder_url])
  202. // {
  203. // [self err_log:[RAUtils base64en:[RAConvertor dict2string:params]] result:[RAUtils base64en:[RAConvertor dict2string:ret]] module:url code:RESULT_NET_ERROR];
  204. // }
  205. // return jsonData;
  206. //
  207. // }
  208. // else
  209. // {
  210. // // NSString* err_msg = [error localizedDescription];
  211. // NSMutableString *str = [[NSMutableString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
  212. //
  213. // DebugLog(@"data string: %@",str);
  214. // NSError *error1 = nil;
  215. //
  216. // NSMutableDictionary* jsobj = [[NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers error:&error1] mutableCopy];
  217. //
  218. // if(jsobj==nil)// 服务器返回不是json
  219. // {
  220. //
  221. // jsobj=[[NSMutableDictionary alloc] init];
  222. // [jsobj setValue:[NSNumber numberWithInt:RESULT_NO_RESPONSE] forKey:@"result"];
  223. //
  224. // }
  225. // if([jsobj[@"encrypt"] boolValue]==true)
  226. // {
  227. // jsobj = decryptBlock(jsobj);
  228. // }
  229. // if (resultBlock) {
  230. // jsobj = resultBlock(jsobj);
  231. // }
  232. //
  233. // int result=[[jsobj valueForKey:@"result"] intValue];
  234. // if(![url isEqualToString:recorder_url]&&/*![url isEqualToString:URL_DOWNLOAD_OFFLINE]&&*/result!=2&&result!=99)
  235. // {
  236. // [self err_log:[RAUtils base64en:[RAConvertor dict2string:params]] result:[RAUtils base64en:str] module:url code:result];
  237. // }
  238. // NSData *jsonData = [NSJSONSerialization dataWithJSONObject:jsobj
  239. // options:0
  240. // error:nil];
  241. // return jsonData;
  242. //
  243. // }
  244. // return responseData;
  245. // }
  246. }
  247. +(NSDictionary*)err_log:(NSString*) up_params result:(NSString*)result module:(NSString*) module code:(int) code//device:(NSString*) device
  248. {
  249. // NSMutableDictionary* params = [[NSMutableDictionary alloc] init];
  250. // AppDelegate *appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
  251. // if(appDelegate.user!=nil)
  252. // [params setValue:appDelegate.user forKey:@"user"];
  253. //
  254. // [params setValue:up_params forKey:@"upparam"];
  255. //
  256. // [params setValue:[NSNumber numberWithInt:code ] forKey:@"code"];
  257. //
  258. // [params setValue:result forKey:@"result"];
  259. // [params setValue:module forKey:@"interfac"];
  260. //
  261. // [params setValue:[RAUtils base64en:[RAUtils dict2string: [RAUtils device_info]]] forKey:@"device"];
  262. //
  263. //
  264. // // [params setValue:module forKey:@"module"];
  265. //
  266. // // [[UIDevice currentDevice] name];
  267. //
  268. // // if(appDelegate.offline_mode)
  269. // // {
  270. // // return [OLDataProvider offline_notimpl];
  271. // // }
  272. // if(![self IsNetworkAvailable])
  273. // return [RAUtils error_json:RESULT_NET_NOTAVAILABLE err_msg:nil];
  274. //
  275. // NSData* json=[self get_json:URL_ERR_LOG parameters:params];
  276. // if(json==nil)
  277. // return nil;
  278. // NSError *error=nil;
  279. // NSDictionary *jsobj = [NSJSONSerialization JSONObjectWithData:json options:NSJSONReadingMutableLeaves error:&error];
  280. // return jsobj;
  281. // 子类没有处理err_log函数时的默认处理。
  282. NSMutableDictionary* jsobj = [@{@"result":@"2"} mutableCopy];
  283. return jsobj;
  284. }
  285. + (NSURLSessionTask *)upload:(NSData *)filedata FileName:(NSString*) filename Params:(NSDictionary *)params ToHost:(NSString *)urlString Result:(resultHandler)r Progress:(progressHandler)p DecryptHandler:(id (^)(NSString *))decrypt {
  286. // NSString *fileName = [filePath lastPathComponent];
  287. NSMutableData *dataM = [NSMutableData data];
  288. NSMutableString *stringM = [NSMutableString string];
  289. DebugLog(@"================parms==================");
  290. for (NSString *key in params) {
  291. [stringM appendString:[NSString stringWithFormat:@"--%@\r\n",BOUNDARY]];
  292. [stringM appendFormat:@"Content-Type: text/plain; charset=UTF-8\r\n"];
  293. [stringM appendFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n",key];
  294. [stringM appendFormat:@"%@\r\n",[params objectForKey:key]];
  295. DebugLog(@"parameter: key=%@ value=%@",key,[params objectForKey:key]);
  296. }
  297. DebugLog(@"================parms==================");
  298. // Apex Drivers 2018.5.5
  299. if (filedata) {
  300. [stringM appendString:[NSString stringWithFormat:@"--%@\r\n",BOUNDARY]];
  301. [stringM appendFormat:@"Content-Disposition: form-data; name=\"upfile\"; filename=%@\r\n",filename];
  302. [stringM appendString:@"Content-Type: application/mac-binary\r\n"];
  303. [stringM appendString:@"\r\n"];
  304. NSData *stringM_data = [stringM dataUsingEncoding:NSUTF8StringEncoding];
  305. [dataM appendData:stringM_data];
  306. // NSData *file_data = [NSData dataWithContentsOfFile:filePath];
  307. [dataM appendData:filedata];
  308. NSString *end = [NSString stringWithFormat:@"\r\n--%@--",BOUNDARY];
  309. [dataM appendData:[end dataUsingEncoding:NSUTF8StringEncoding]];
  310. } else {
  311. NSData *stringM_data = [stringM dataUsingEncoding:NSUTF8StringEncoding];
  312. [dataM appendData:stringM_data];
  313. NSString *end = [NSString stringWithFormat:@"\r\n--%@--",BOUNDARY];
  314. [dataM appendData:[end dataUsingEncoding:NSUTF8StringEncoding]];
  315. }
  316. // Data
  317. NSData *data = dataM;
  318. // 可变请求
  319. NSURL *url = [NSURL URLWithString:urlString];
  320. NSMutableURLRequest *requestM = [NSMutableURLRequest requestWithURL:url
  321. cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:JSON_TIMEOUT];
  322. // line note
  323. requestM.HTTPMethod = @"POST";
  324. // request header
  325. [requestM addValue:@"close" forHTTPHeaderField:@"Connection"];
  326. [requestM addValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@",BOUNDARY] forHTTPHeaderField:@"Content-Type"];
  327. [requestM addValue:@"multipart/form-data" forHTTPHeaderField:@"enctype"];
  328. [requestM addValue:[NSString stringWithFormat:@"%lu", (unsigned long)[data length]] forHTTPHeaderField:@"Content-Length"];
  329. // request body
  330. requestM.HTTPBody = data;
  331. NSURLSession *urlSession = [self standSession];
  332. if (urlSession.delegate) {
  333. if ([urlSession.delegate isKindOfClass:[RANetworkTaskDelegate class]]) {
  334. RANetworkTaskDelegate *delegate = (RANetworkTaskDelegate *)urlSession.delegate;
  335. if (p) {
  336. delegate.p = p;
  337. }
  338. if (r) {
  339. delegate.r = r;
  340. }
  341. if (decrypt) {
  342. delegate.decryptHandler = decrypt;
  343. }
  344. }
  345. }
  346. NSURLSessionDataTask *dataTask = [urlSession uploadTaskWithRequest:requestM fromData:data];
  347. [dataTask resume];
  348. return dataTask;
  349. }
  350. + (NSURLSessionTask *)upload:(NSString *)filePath Params:(NSDictionary *)params ToHost:(NSString *)urlString Result:(resultHandler)r Progress:(progressHandler)p DecryptHandler:(id (^)(NSString *))decrypt {
  351. NSString *fileName = [filePath lastPathComponent];
  352. NSData *file_data = [NSData dataWithContentsOfFile:filePath];
  353. return [self upload:file_data FileName:fileName Params:params ToHost:urlString Result:r Progress:p DecryptHandler:decrypt];
  354. //
  355. // NSMutableData *dataM = [NSMutableData data];
  356. //
  357. // NSMutableString *stringM = [NSMutableString string];
  358. //
  359. //
  360. // DebugLog(@"================parms==================");
  361. //
  362. //
  363. //
  364. // for (NSString *key in params) {
  365. //
  366. // [stringM appendString:[NSString stringWithFormat:@"--%@\r\n",BOUNDARY]];
  367. // [stringM appendFormat:@"Content-Type: text/plain; charset=UTF-8\r\n"];
  368. // [stringM appendFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n",key];
  369. // [stringM appendFormat:@"%@\r\n",[params objectForKey:key]];
  370. //
  371. //
  372. // DebugLog(@"parameter: key=%@ value=%@",key,[params objectForKey:key]);
  373. // }
  374. // DebugLog(@"================parms==================");
  375. // [stringM appendString:[NSString stringWithFormat:@"--%@\r\n",BOUNDARY]];
  376. //
  377. // [stringM appendFormat:@"Content-Disposition: form-data; name=\"upfile\"; filename=%@\r\n",fileName];
  378. // [stringM appendString:@"Content-Type: application/mac-binary\r\n"];
  379. // [stringM appendString:@"\r\n"];
  380. //
  381. // NSData *stringM_data = [stringM dataUsingEncoding:NSUTF8StringEncoding];
  382. // [dataM appendData:stringM_data];
  383. //
  384. // NSData *file_data = [NSData dataWithContentsOfFile:filePath];
  385. // [dataM appendData:file_data];
  386. //
  387. // NSString *end = [NSString stringWithFormat:@"\r\n--%@--",BOUNDARY];
  388. // [dataM appendData:[end dataUsingEncoding:NSUTF8StringEncoding]];
  389. //
  390. // // Data
  391. // NSData *data = dataM;
  392. //
  393. //
  394. // // 可变请求
  395. // NSURL *url = [NSURL URLWithString:urlString];
  396. // NSMutableURLRequest *requestM = [NSMutableURLRequest requestWithURL:url
  397. // cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:JSON_TIMEOUT];
  398. // // line note
  399. // requestM.HTTPMethod = @"POST";
  400. //
  401. // // request header
  402. // [requestM addValue:@"close" forHTTPHeaderField:@"Connection"];
  403. //
  404. // [requestM addValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@",BOUNDARY] forHTTPHeaderField:@"Content-Type"];
  405. //
  406. // [requestM addValue:[NSString stringWithFormat:@"%lu", (unsigned long)[data length]] forHTTPHeaderField:@"Content-Length"];
  407. //
  408. // // request body
  409. // requestM.HTTPBody = data;
  410. //
  411. //
  412. //
  413. // NSURLSession *urlSession = [self standSession];
  414. //
  415. // if (urlSession.delegate) {
  416. // if ([urlSession.delegate isKindOfClass:[RANetworkTaskDelegate class]]) {
  417. //
  418. // RANetworkTaskDelegate *delegate = (RANetworkTaskDelegate *)urlSession.delegate;
  419. //
  420. // if (p) {
  421. // delegate.p = p;
  422. // }
  423. //
  424. // if (r) {
  425. // delegate.r = r;
  426. // }
  427. //
  428. // if (decrypt) {
  429. // delegate.decryptHandler = decrypt;
  430. // }
  431. //
  432. // }
  433. // }
  434. //
  435. // NSURLSessionDataTask *dataTask = [urlSession uploadTaskWithRequest:requestM fromData:data];
  436. //
  437. // [dataTask resume];
  438. //
  439. // return dataTask;
  440. }
  441. + (NSURLSession *)standSession {
  442. NSURLSession *session = nil;
  443. RANetworkTaskDelegate *delegate = [RANetworkTaskDelegate sharedInstance];
  444. NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
  445. config.timeoutIntervalForRequest = JSON_TIMEOUT;
  446. NSOperationQueue *queue = [[NSOperationQueue alloc] init];
  447. session = [NSURLSession sessionWithConfiguration:config delegate:delegate delegateQueue:queue];
  448. return session;
  449. }
  450. + (NSURLSessionDownloadTask *)downloadFileOffset:(NSUInteger)offset Param:(NSDictionary *)param from:(NSString *)url method:(NSString *)method toPath:(NSString *)path progressHandler:(progressHandler)progressHandler completionHandler:(resultHandler)result {
  451. NSURLSession *sessoin = [self standSession];
  452. RANetworkTaskDelegate *delegate = (RANetworkTaskDelegate *)sessoin.delegate;
  453. delegate.downloadTask = YES;
  454. delegate.fileCachePath = path;
  455. if (progressHandler) {
  456. delegate.p = progressHandler;
  457. }
  458. if (result) {
  459. delegate.r = result;
  460. }
  461. NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]];
  462. req.HTTPMethod = method;
  463. if (offset > 0) {
  464. [req addValue:[NSString stringWithFormat:@"bytes=%ld-",(unsigned long)offset] forHTTPHeaderField:@"Range"];
  465. }
  466. // 拼接参数
  467. if (param && param.allValues.count > 0) {
  468. __block NSMutableArray *paramArr = [NSMutableArray array];
  469. [param enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
  470. [paramArr addObject:[NSString stringWithFormat:@"%@=%@",key,obj]];
  471. }];
  472. NSString *paramStr = [paramArr componentsJoinedByString:@"&"];
  473. req.HTTPBody = [paramStr dataUsingEncoding:NSUTF8StringEncoding];
  474. }
  475. NSURLSessionDownloadTask *downloadTask = [sessoin downloadTaskWithRequest:req];
  476. [downloadTask resume];
  477. return downloadTask;
  478. }
  479. #pragma mark new interface
  480. +(NSMutableDictionary*) prepare_additional_params:(NSMutableDictionary* ) params
  481. {
  482. //
  483. // NSString *userAction = [params valueForKey:kAction];
  484. // NSMutableDictionary *extra = [[params valueForKey:kExtra] mutableCopy];
  485. // if ([userAction isEqualToString:@"Login"]) {
  486. // if (!extra) {
  487. // extra = [NSMutableDictionary dictionary];
  488. // }
  489. // [extra setObject:[params objectForKey:@"user"] forKey:@"user"];
  490. // }
  491. return params;
  492. }
  493. +(void)request_interface : (NSString*) url parameters:(NSMutableDictionary *) params err_record_url:(NSString* )recorder_url completionHandler:(resultHandler)result retry:(int) retry
  494. {
  495. // __block int retry = 0;
  496. DebugLog(url);
  497. if(![NetworkUtils IsNetworkAvailable])
  498. {
  499. dispatch_async(dispatch_get_main_queue(), ^{
  500. if(result)
  501. result([[RAConvertor string2dict:[NSString stringWithFormat:@"{\"result\":%d,\"err_msg\":\"%@\"}",RESULT_NET_NOTAVAILABLE,NSLocalizedString(@"net_not_available", nil)]] mutableCopy]);
  502. });
  503. // return detailContent;
  504. return ;
  505. }
  506. params = [self prepare_additional_params:params];
  507. //repeat:
  508. // {
  509. // return [self fake_json:url];
  510. // AppDelegate *appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
  511. //分界线的标识符
  512. NSString *TWITTERFON_FORM_BOUNDARY = @"AaB03x";
  513. //根据url初始化request
  514. NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]
  515. cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
  516. timeoutInterval:JSON_TIMEOUT];
  517. //分界线 --AaB03x
  518. NSString *MPboundary=[[NSString alloc]initWithFormat:@"--%@",TWITTERFON_FORM_BOUNDARY];
  519. //结束符 AaB03x--
  520. NSString *endMPboundary=[[NSString alloc]initWithFormat:@"%@--",MPboundary];
  521. //要上传的图片
  522. // UIImage *image=[params objectForKey:@"pic"];
  523. //得到图片的data
  524. /*
  525. // NSData* data = [NSData dataWithContentsOfFile:file_path];
  526. */
  527. //http body的字符串
  528. NSMutableString *body=[[NSMutableString alloc]init];
  529. // NSMutableDictionary* params = [[NSMutableDictionary alloc] init];
  530. // [params setValue:@"handset_login" forKey:@"action"];
  531. // [headers setValue:[NSString stringWithFormat:@"%d",dataLength] forKey:@"Content-Length"];
  532. // [params setValue:appDelegate.sessionid forKey:@"sessionid"];
  533. // [params setValue:password forKey:@"password"];
  534. // [params setValue:[NSString stringWithFormat:@"%d",ver] forKey:@"auth_ver"];
  535. // [headers setValue:headQuerlString forKey:@"param"];
  536. //参数的集合的所有key的集合
  537. NSArray *keys= [params allKeys];
  538. DebugLog(@"================parms==================");
  539. //遍历keys
  540. for(int i=0;i<[keys count];i++)
  541. {
  542. //得到当前key
  543. NSString *key=[keys objectAtIndex:i];
  544. //如果key不是pic,说明value是字符类型,比如name:Boris
  545. if(![key isEqualToString:@"pic"])
  546. {
  547. //添加分界线,换行
  548. [body appendFormat:@"%@\r\n",MPboundary];
  549. //添加字段名称,换2行
  550. [body appendFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n",key];
  551. //添加字段的值
  552. [body appendFormat:@"%@\r\n",[params objectForKey:key]];
  553. DebugLog(@"parameter: key=%@ value=%@",key,[params objectForKey:key]);
  554. }
  555. }
  556. DebugLog(@"================parms==================");
  557. ////添加分界线,换行
  558. /* [body appendFormat:@"%@\r\n",MPboundary];
  559. //声明pic字段,文件名为boris.png
  560. NSString * file_format=[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"upfile\"; filename=\"%@\"\r\n", [file_path lastPathComponent]];
  561. [body appendFormat:@"%@", file_format];
  562. //声明上传文件的格式
  563. [body appendFormat:@"Content-Type: application/zip\r\n\r\n"];
  564. */
  565. //声明结束符:--AaB03x--
  566. NSString *end=[[NSString alloc]initWithFormat:@"%@",endMPboundary];
  567. //声明myRequestData,用来放入http body
  568. NSMutableData *myRequestData=[NSMutableData data];
  569. //将body字符串转化为UTF8格式的二进制
  570. [myRequestData appendData:[body dataUsingEncoding:NSUTF8StringEncoding]];
  571. /*
  572. //将image的data加入
  573. [myRequestData appendData:data];
  574. */
  575. //加入结束符--AaB03x--
  576. [myRequestData appendData:[end dataUsingEncoding:NSUTF8StringEncoding]];
  577. //设置HTTPHeader中Content-Type的值
  578. NSString *content=[[NSString alloc]initWithFormat:@"multipart/form-data; boundary=%@",TWITTERFON_FORM_BOUNDARY];
  579. //设置HTTPHeader
  580. [request setValue:content forHTTPHeaderField:@"Content-Type"];
  581. [request setValue:@"multipart/form-data" forHTTPHeaderField:@"enctype"];
  582. // 关闭keep alive
  583. [request setValue:@"close" forHTTPHeaderField:@"Connection"];
  584. //设置Content-Length
  585. [request setValue:[NSString stringWithFormat:@"%lu", (unsigned long)[myRequestData length]] forHTTPHeaderField:@"Content-Length"];
  586. //设置http body
  587. [request setHTTPBody:myRequestData];
  588. //http method
  589. [request setHTTPMethod:@"POST"];
  590. // NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]];
  591. //
  592. // request.HTTPMethod = @"POST";
  593. //
  594. //
  595. // // 拼接参数
  596. // if (params && params.allValues.count > 0) {
  597. // __block NSMutableArray *paramArr = [NSMutableArray array];
  598. //
  599. // DebugLog(@"================PARAMS BEGIN==================");
  600. // [params enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
  601. // [paramArr addObject:[NSString stringWithFormat:@"%@=%@",key,obj]];
  602. // DebugLog(@"parameter: key=%@ value=%@",key,obj);
  603. // }];
  604. //
  605. // DebugLog(@"================PARAMS END==================");
  606. // NSString *paramStr = [paramArr componentsJoinedByString:@"&"];
  607. // paramStr =[paramStr stringByAppendingString:@"&"];
  608. //// DebugLog(@"http body %@",paramStr);
  609. // NSData* requestdata =[paramStr dataUsingEncoding:NSUTF8StringEncoding];
  610. // request.HTTPBody = requestdata;
  611. // [request setValue:[NSString stringWithFormat:@"%lu", (unsigned long)[requestdata length]] forHTTPHeaderField:@"Content-Length"];
  612. // }
  613. NSURLSession *urlSession = [self standSession];
  614. if (urlSession.delegate) {
  615. if ([urlSession.delegate isKindOfClass:[RANetworkTaskDelegate class]]) {
  616. RANetworkTaskDelegate *delegate = (RANetworkTaskDelegate *)urlSession.delegate;
  617. // if (p) {
  618. // delegate.p = p;
  619. // }
  620. //
  621. if (result) {
  622. delegate.r = result;
  623. }
  624. //
  625. // if (decrypt) {
  626. // delegate.decryptHandler = decrypt;
  627. // }
  628. }
  629. }
  630. NSURLSessionDataTask *dataTask =[urlSession dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
  631. NSData *responseData =data;
  632. DebugLog(@"request_interface result length:%ld", data.length);
  633. NSHTTPURLResponse* urlResponse =(NSHTTPURLResponse*)response;
  634. if (responseData==nil) {
  635. DebugLog(@"request_interface error:%@", [error localizedDescription]);
  636. NSMutableDictionary* ret = [[NSMutableDictionary alloc] init];
  637. //#define RESULT_FALSE 0
  638. //#define RESULT_TRUE 2
  639. //#define RESULT_NET_ERROR -3
  640. //#define RESULT_NET_NOTAVAILABLE -4
  641. //#define RESULT_ERROR -5
  642. //#define RESULT_LOCALFILE_ERROR -7
  643. //#define RESULT_USERAUTH_ERROR -9
  644. //#define RESULT_UPDATE_USERAUTH_ERROR -11
  645. //#define RESULT_SESSION_EXPIRED -13
  646. //#define RESULT_VER_LOW
  647. // NSString * moreinfo = error.description ;
  648. NSString* err_msg = [error localizedDescription];
  649. //-----------------retry 3 times for error code -1005------------------------
  650. if(error.code==-1005&&retry<3)
  651. {
  652. int new_retry=retry+1;
  653. dispatch_async(dispatch_get_main_queue(), ^{
  654. [self request_interface:url parameters:params err_record_url:recorder_url completionHandler:result retry:new_retry];
  655. return;
  656. });
  657. // retry++;
  658. // goto repeat;
  659. }
  660. //-----------------end retry 3 times for error code -1005------------------------
  661. NSDictionary* error_json = [RAUtils error_dict:error];
  662. [ret setObject:error_json forKey:@"err_obj"];
  663. NSString* resp_msg= nil;
  664. if(err_msg.length==0)
  665. {
  666. err_msg =[NSHTTPURLResponse localizedStringForStatusCode:urlResponse.statusCode];
  667. resp_msg = err_msg;
  668. }
  669. [ret setValue:[NSString stringWithFormat:@"%d",RESULT_NET_ERROR] forKey:@"result"];
  670. [ret setValue:err_msg forKey:@"err_msg"];
  671. [ret setValue:resp_msg forKey:@"resp_msg"];
  672. [ret setValue:[NSString stringWithFormat:@"%ld",(long)urlResponse.statusCode] forKey:@"resp_code"];
  673. NSData *jsonData = [NSJSONSerialization dataWithJSONObject:ret
  674. options:0
  675. error:nil];
  676. if(![url isEqualToString:recorder_url])
  677. {
  678. [self err_log:[RAUtils base64en:[RAConvertor dict2string:params]] result:[RAUtils base64en:[RAConvertor dict2string:ret]] module:url code:RESULT_NET_ERROR];
  679. }
  680. dispatch_async(dispatch_get_main_queue(), ^{
  681. if(result)
  682. return result([[RAConvertor data2dict:jsonData] mutableCopy]);
  683. });
  684. }
  685. else
  686. {
  687. NSString *str = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
  688. DebugLog(@"request_interface result:%@", str);
  689. NSMutableDictionary* dict =[[RAConvertor data2dict:responseData] mutableCopy];
  690. if([dict[@"result"] intValue]==RESULT_USERAUTH_ERROR)
  691. {
  692. dict[@"err_msg"]=@"Authorization failed.";
  693. }
  694. // 兼容不同后台的错误消息反馈
  695. if([dict[@"result"] intValue]!=RESULT_TRUE&&dict[@"msg"]!=nil && dict[@"err_msg"]==nil)
  696. {
  697. dict[@"err_msg"]=dict[@"msg"];
  698. }
  699. if([dict[@"result"] intValue]!=RESULT_TRUE&&dict[@"message"]!=nil && dict[@"err_msg"]==nil)
  700. {
  701. dict[@"err_msg"]=dict[@"message"];
  702. }
  703. // if([dict[@"result"] intValue]==RESULT_ERROR)
  704. // {
  705. //// RESULT_ERROR
  706. // }
  707. if(dict==nil)
  708. {
  709. dict= [NSMutableDictionary new];
  710. dict[@"result"]=@9;
  711. dict[@"err_msg"]=@"Sorry, can not access server, please contact support.";
  712. }
  713. dispatch_async(dispatch_get_main_queue(), ^{
  714. if(result)
  715. return result(dict);
  716. });
  717. }
  718. }];
  719. // NSURLSessionDataTask *dataTask = [urlSession dataTaskWithRequest:request ];
  720. [dataTask resume];
  721. return ;
  722. //
  723. //
  724. // NSHTTPURLResponse* urlResponse = nil;
  725. //
  726. // NSError *error = nil;
  727. // NSLog(@"begin request %@",url);
  728. //
  729. // NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&error];
  730. //
  731. //
  732. // DebugLog(@"url: %@",url);
  733. //
  734. // DebugLog(@"response: %@",[NSHTTPURLResponse localizedStringForStatusCode:urlResponse.statusCode]);
  735. //
  736. //
  737. // NSLog(@"get response");
  738. // if (responseData==nil) {
  739. //
  740. // // DebugLog(@"response error:%@", [error localizedDescription]);
  741. //
  742. //
  743. // NSMutableDictionary* ret = [[NSMutableDictionary alloc] init];
  744. // //#define RESULT_FALSE 0
  745. // //#define RESULT_TRUE 2
  746. // //#define RESULT_NET_ERROR -3
  747. // //#define RESULT_NET_NOTAVAILABLE -4
  748. // //#define RESULT_ERROR -5
  749. // //#define RESULT_LOCALFILE_ERROR -7
  750. // //#define RESULT_USERAUTH_ERROR -9
  751. // //#define RESULT_UPDATE_USERAUTH_ERROR -11
  752. // //#define RESULT_SESSION_EXPIRED -13
  753. // //#define RESULT_VER_LOW
  754. //
  755. // // NSString * moreinfo = error.description ;
  756. //
  757. // NSString* err_msg = [error localizedDescription];
  758. //
  759. //
  760. // //-----------------retry 3 times for error code -1005------------------------
  761. // if(error.code==-1005&&retry<3)
  762. // {
  763. // retry++;
  764. // goto repeat;
  765. //
  766. // }
  767. // //-----------------end retry 3 times for error code -1005------------------------
  768. //
  769. // NSDictionary* error_json = [RAUtils error_dict:error];
  770. // [ret setObject:error_json forKey:@"err_obj"];
  771. // NSString* resp_msg= nil;
  772. //
  773. // if(err_msg.length==0)
  774. // {
  775. // err_msg =[NSHTTPURLResponse localizedStringForStatusCode:urlResponse.statusCode];
  776. // resp_msg = err_msg;
  777. // }
  778. // [ret setValue:[NSString stringWithFormat:@"%d",RESULT_NET_ERROR] forKey:@"result"];
  779. // [ret setValue:err_msg forKey:@"err_msg"];
  780. // [ret setValue:resp_msg forKey:@"resp_msg"];
  781. // [ret setValue:[NSString stringWithFormat:@"%ld",(long)urlResponse.statusCode] forKey:@"resp_code"];
  782. //
  783. //
  784. // NSData *jsonData = [NSJSONSerialization dataWithJSONObject:ret
  785. // options:0
  786. // error:nil];
  787. // if(![url isEqualToString:recorder_url])
  788. // {
  789. // [self err_log:[RAUtils base64en:[RAConvertor dict2string:params]] result:[RAUtils base64en:[RAConvertor dict2string:ret]] module:url code:RESULT_NET_ERROR];
  790. // }
  791. // return jsonData;
  792. //
  793. // }
  794. // else
  795. // {
  796. // // NSString* err_msg = [error localizedDescription];
  797. // NSMutableString *str = [[NSMutableString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
  798. //
  799. // DebugLog(@"data string: %@",str);
  800. // NSError *error1 = nil;
  801. //
  802. // NSMutableDictionary* jsobj = [[NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers error:&error1] mutableCopy];
  803. //
  804. // if(jsobj==nil)// 服务器返回不是json
  805. // {
  806. //
  807. // jsobj=[[NSMutableDictionary alloc] init];
  808. // [jsobj setValue:[NSNumber numberWithInt:RESULT_NO_RESPONSE] forKey:@"result"];
  809. //
  810. // }
  811. //// if([jsobj[@"encrypt"] boolValue]==true)
  812. //// {
  813. //// jsobj = decryptBlock(jsobj);
  814. //// }
  815. //// if (resultBlock) {
  816. //// jsobj = resultBlock(jsobj);
  817. //// }
  818. //
  819. // int result=[[jsobj valueForKey:@"result"] intValue];
  820. // if(![url isEqualToString:recorder_url]&&/*![url isEqualToString:URL_DOWNLOAD_OFFLINE]&&*/result!=2&&result!=99)
  821. // {
  822. // [self err_log:[RAUtils base64en:[RAConvertor dict2string:params]] result:[RAUtils base64en:str] module:url code:result];
  823. // }
  824. // NSData *jsonData = [NSJSONSerialization dataWithJSONObject:jsobj
  825. // options:0
  826. // error:nil];
  827. // return jsonData;
  828. //
  829. // }
  830. // return responseData;
  831. // }
  832. }
  833. +(void)request_file_fast : (NSString*) url parameters:(NSMutableDictionary *) params completionHandler:(resultHandler)result
  834. // Param:(NSDictionary *)param from:(NSString *)url completionHandler:(resultHandler)result
  835. /* dataHandler:(dataHandler)returndata*/
  836. {
  837. if(![NetworkUtils IsNetworkAvailable])
  838. {
  839. dispatch_async(dispatch_get_main_queue(), ^{
  840. if(result)
  841. result([[RAConvertor string2dict:[NSString stringWithFormat:@"{\"result\":%d,\"err_msg\":\"%@\"}",RESULT_NET_NOTAVAILABLE,NSLocalizedString(@"net_not_available", nil)]] mutableCopy]);
  842. });
  843. // return detailContent;
  844. return ;
  845. }
  846. params = [self prepare_additional_params:params];
  847. NSURLSession *urlSession = [self standSession];
  848. // RANetworkTaskDelegate *delegate = (RANetworkTaskDelegate *)urlSession.delegate;
  849. // delegate.downloadTask = YES;
  850. // delegate.fileCachePath = path;
  851. // if (progressHandler) {
  852. // delegate.p = progressHandler;
  853. // }
  854. //
  855. // if (result) {
  856. // delegate.r = result;
  857. // }
  858. NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]];
  859. request.HTTPMethod = @"Post";
  860. //
  861. // if (offset > 0) {
  862. // [request addValue:[NSString stringWithFormat:@"bytes=%ld-",(unsigned long)offset] forHTTPHeaderField:@"Range"];
  863. // }
  864. // 拼接参数
  865. if (params && params.allValues.count > 0) {
  866. __block NSMutableArray *paramArr = [NSMutableArray array];
  867. [params enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
  868. [paramArr addObject:[NSString stringWithFormat:@"%@=%@",key,obj]];
  869. }];
  870. NSString *paramStr = [paramArr componentsJoinedByString:@"&"];
  871. request.HTTPBody = [paramStr dataUsingEncoding:NSUTF8StringEncoding];
  872. }
  873. NSURLSessionDownloadTask* downloadTask=[urlSession downloadTaskWithRequest:request completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {
  874. NSHTTPURLResponse* urlResponse =(NSHTTPURLResponse*)response;
  875. NSData* data =[NSData dataWithContentsOfURL:location] ;
  876. NSMutableDictionary* ret = [[NSMutableDictionary alloc] init];
  877. if(data==nil)
  878. {
  879. NSString* err_msg = [error localizedDescription];
  880. NSDictionary* error_json = [RAUtils error_dict:error];
  881. [ret setObject:error_json forKey:@"err_obj"];
  882. NSString* resp_msg= nil;
  883. if(err_msg.length==0)
  884. {
  885. err_msg =[NSHTTPURLResponse localizedStringForStatusCode:urlResponse.statusCode];
  886. resp_msg = err_msg;
  887. }
  888. [ret setValue:[NSString stringWithFormat:@"%d",RESULT_NET_ERROR] forKey:@"result"];
  889. [ret setValue:err_msg forKey:@"err_msg"];
  890. [ret setValue:resp_msg forKey:@"resp_msg"];
  891. [ret setValue:[NSString stringWithFormat:@"%ld",(long)urlResponse.statusCode] forKey:@"resp_code"];
  892. dispatch_async(dispatch_get_main_queue(), ^{
  893. if(result)
  894. result(ret);
  895. });
  896. }
  897. else
  898. {
  899. NSString* path=NSTemporaryDirectory();
  900. if (response.suggestedFilename) {
  901. path = [path stringByAppendingPathComponent:response.suggestedFilename];
  902. } else {
  903. path = [path stringByAppendingPathComponent:[NSUUID UUID].UUIDString];
  904. }
  905. NSError *error = nil;
  906. if([[NSFileManager defaultManager] fileExistsAtPath:path])
  907. {
  908. [[NSFileManager defaultManager] removeItemAtPath:path error:nil];
  909. }
  910. [[NSFileManager defaultManager] copyItemAtPath:location.path toPath:path error:&error];
  911. // [[NSFileManager defaultManager] copyItemAtURL:[NSURL URLWithString:location.path] toURL:[NSURL URLWithString:path] error:&error];
  912. // NSFileManager
  913. // NSString *cacheDir = NSTemporaryDirectory();
  914. //
  915. // if (![[NSFileManager defaultManager] fileExistsAtPath:cacheDir]) {
  916. // [[NSFileManager defaultManager] createDirectoryAtPath:cacheDir withIntermediateDirectories:NO attributes:nil error:nil];
  917. // }
  918. ret[@"suggestedFilename"]=response.suggestedFilename;
  919. ret[@"result"]=@"2";
  920. ret[@"data"]=data;
  921. ret[@"path"]=path;//[location absoluteString];
  922. dispatch_async(dispatch_get_main_queue(), ^{
  923. if(result)
  924. result(ret);
  925. });
  926. }
  927. // if(returndata)
  928. // {
  929. // returndata(data);
  930. // }
  931. }];
  932. [downloadTask resume];
  933. return ;
  934. }
  935. +(void)request_upload_fast :(NSData *)filedata FileName:(NSString*) filename server:(NSString*) urlString parameters:(NSMutableDictionary *) params completionHandler:(resultHandler)result
  936. {
  937. // NSString *fileName = [filePath lastPathComponent];
  938. DebugLog(urlString);
  939. NSMutableData *dataM = [NSMutableData data];
  940. NSMutableString *stringM = [NSMutableString string];
  941. DebugLog(@"================parms==================");
  942. for (NSString *key in params) {
  943. [stringM appendString:[NSString stringWithFormat:@"--%@\r\n",BOUNDARY]];
  944. [stringM appendFormat:@"Content-Type: text/plain; charset=UTF-8\r\n"];
  945. [stringM appendFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n",key];
  946. [stringM appendFormat:@"%@\r\n",[params objectForKey:key]];
  947. DebugLog(@"parameter: key=%@ value=%@",key,[params objectForKey:key]);
  948. }
  949. DebugLog(@"================parms==================");
  950. // Apex Drivers 2018.5.5
  951. if (filedata) {
  952. [stringM appendString:[NSString stringWithFormat:@"--%@\r\n",BOUNDARY]];
  953. [stringM appendFormat:@"Content-Disposition: form-data; name=\"upfile\"; filename=%@\r\n",filename];
  954. [stringM appendString:@"Content-Type: application/mac-binary\r\n"];
  955. [stringM appendString:@"\r\n"];
  956. NSData *stringM_data = [stringM dataUsingEncoding:NSUTF8StringEncoding];
  957. [dataM appendData:stringM_data];
  958. // NSData *file_data = [NSData dataWithContentsOfFile:filePath];
  959. [dataM appendData:filedata];
  960. NSString *end = [NSString stringWithFormat:@"\r\n--%@--",BOUNDARY];
  961. [dataM appendData:[end dataUsingEncoding:NSUTF8StringEncoding]];
  962. } else {
  963. NSData *stringM_data = [stringM dataUsingEncoding:NSUTF8StringEncoding];
  964. [dataM appendData:stringM_data];
  965. NSString *end = [NSString stringWithFormat:@"\r\n--%@--",BOUNDARY];
  966. [dataM appendData:[end dataUsingEncoding:NSUTF8StringEncoding]];
  967. }
  968. // Data
  969. NSData *data = dataM;
  970. // 可变请求
  971. NSURL *url = [NSURL URLWithString:urlString];
  972. NSMutableURLRequest *requestM = [NSMutableURLRequest requestWithURL:url
  973. cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:JSON_TIMEOUT];
  974. // line note
  975. requestM.HTTPMethod = @"POST";
  976. // request header
  977. [requestM addValue:@"close" forHTTPHeaderField:@"Connection"];
  978. [requestM addValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@",BOUNDARY] forHTTPHeaderField:@"Content-Type"];
  979. [requestM addValue:@"multipart/form-data" forHTTPHeaderField:@"enctype"];
  980. [requestM addValue:[NSString stringWithFormat:@"%lu", (unsigned long)[data length]] forHTTPHeaderField:@"Content-Length"];
  981. // request body
  982. requestM.HTTPBody = data;
  983. NSURLSession *urlSession = [self standSession];
  984. // if (urlSession.delegate) {
  985. // if ([urlSession.delegate isKindOfClass:[RANetworkTaskDelegate class]]) {
  986. //
  987. // RANetworkTaskDelegate *delegate = (RANetworkTaskDelegate *)urlSession.delegate;
  988. //
  989. // if (p) {
  990. // delegate.p = p;
  991. // }
  992. //
  993. // if (r) {
  994. // delegate.r = r;
  995. // }
  996. //
  997. // if (decrypt) {
  998. // delegate.decryptHandler = decrypt;
  999. // }
  1000. //
  1001. // }
  1002. // }
  1003. // NSURLSessionDataTask *dataTask = [urlSession uploadTaskWithRequest:requestM fromData:data];
  1004. // [urlSession uploadTaskWithRequest:<#(nonnull NSURLRequest *)#> fromData:<#(nullable NSData *)#> completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
  1005. // <#code#>
  1006. // }];
  1007. // [urlSession uploadTaskWithRequest:<#(nonnull NSURLRequest *)#> fromFile:<#(nonnull NSURL *)#> completionHandler:<#^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error)completionHandler#>]
  1008. NSURLSessionUploadTask *uploadTask = [urlSession uploadTaskWithRequest:requestM fromData:data completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
  1009. NSData *responseData =data;
  1010. NSHTTPURLResponse* urlResponse =(NSHTTPURLResponse*)response;
  1011. if (responseData==nil) {
  1012. DebugLog(@"request_upload_fast error:%@", [error localizedDescription]);
  1013. NSMutableDictionary* ret = [[NSMutableDictionary alloc] init];
  1014. //#define RESULT_FALSE 0
  1015. //#define RESULT_TRUE 2
  1016. //#define RESULT_NET_ERROR -3
  1017. //#define RESULT_NET_NOTAVAILABLE -4
  1018. //#define RESULT_ERROR -5
  1019. //#define RESULT_LOCALFILE_ERROR -7
  1020. //#define RESULT_USERAUTH_ERROR -9
  1021. //#define RESULT_UPDATE_USERAUTH_ERROR -11
  1022. //#define RESULT_SESSION_EXPIRED -13
  1023. //#define RESULT_VER_LOW
  1024. // NSString * moreinfo = error.description ;
  1025. NSString* err_msg = [error localizedDescription];
  1026. // //-----------------retry 3 times for error code -1005------------------------
  1027. // if(error.code==-1005&&retry<3)
  1028. // {
  1029. // int new_retry=retry+1;
  1030. // [self request_interface:url parameters:params err_record_url:recorder_url completionHandler:result retry:new_retry];
  1031. // return;
  1032. // // retry++;
  1033. // // goto repeat;
  1034. //
  1035. // }
  1036. //-----------------end retry 3 times for error code -1005------------------------
  1037. NSDictionary* error_json = [RAUtils error_dict:error];
  1038. [ret setObject:error_json forKey:@"err_obj"];
  1039. NSString* resp_msg= nil;
  1040. if(err_msg.length==0)
  1041. {
  1042. err_msg =[NSHTTPURLResponse localizedStringForStatusCode:urlResponse.statusCode];
  1043. resp_msg = err_msg;
  1044. }
  1045. [ret setValue:[NSString stringWithFormat:@"%d",RESULT_NET_ERROR] forKey:@"result"];
  1046. [ret setValue:err_msg forKey:@"err_msg"];
  1047. [ret setValue:resp_msg forKey:@"resp_msg"];
  1048. [ret setValue:[NSString stringWithFormat:@"%ld",(long)urlResponse.statusCode] forKey:@"resp_code"];
  1049. NSData *jsonData = [NSJSONSerialization dataWithJSONObject:ret
  1050. options:0
  1051. error:nil];
  1052. // if(![urlString isEqualToString:recorder_url])
  1053. // {
  1054. // [self err_log:[RAUtils base64en:[RAConvertor dict2string:params]] result:[RAUtils base64en:[RAConvertor dict2string:ret]] module:url code:RESULT_NET_ERROR];
  1055. // }
  1056. dispatch_async(dispatch_get_main_queue(), ^{
  1057. if(result)
  1058. return result([[RAConvertor data2dict:jsonData] mutableCopy]);
  1059. });
  1060. }
  1061. else
  1062. {
  1063. NSString *str = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
  1064. DebugLog(@"request_upload_fast result:%@", str);
  1065. NSMutableDictionary* dict =[[RAConvertor data2dict:responseData] mutableCopy];
  1066. if([dict[@"result"] intValue]==RESULT_USERAUTH_ERROR)
  1067. {
  1068. dict[@"err_msg"]=@"Authorization failed.";
  1069. }
  1070. // 兼容不同后台的错误消息反馈
  1071. if([dict[@"result"] intValue]!=RESULT_TRUE&&dict[@"msg"]!=nil && dict[@"err_msg"]==nil)
  1072. {
  1073. dict[@"err_msg"]=dict[@"msg"];
  1074. }
  1075. if([dict[@"result"] intValue]!=RESULT_TRUE&&dict[@"message"]!=nil && dict[@"err_msg"]==nil)
  1076. {
  1077. dict[@"err_msg"]=dict[@"message"];
  1078. }
  1079. if(dict==nil)
  1080. {
  1081. dict= [NSMutableDictionary new];
  1082. dict[@"result"]=@9;
  1083. dict[@"err_msg"]=@"Sorry, can not access server, please contact support.";
  1084. }
  1085. // if([dict[@"result"] intValue]==RESULT_ERROR)
  1086. // {
  1087. //// RESULT_ERROR
  1088. // }
  1089. dispatch_async(dispatch_get_main_queue(), ^{
  1090. if(result)
  1091. return result(dict);
  1092. });
  1093. }
  1094. }];
  1095. [uploadTask resume];
  1096. }
  1097. @end