NetworkUtils.m 48 KB

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