NetworkUtils.m 53 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344
  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. NSLog(@"%@", [[NSString alloc] initWithData:myRequestData encoding:NSUTF8StringEncoding]);
  121. NSHTTPURLResponse* urlResponse = nil;
  122. NSError *error = nil;
  123. NSLog(@"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. NSLog(@"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. NSLog(@"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. //
  682. // NSHTTPURLResponse* urlResponse = nil;
  683. //
  684. // NSError *error = nil;
  685. // NSLog(@"begin request %@",url);
  686. //
  687. // NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&error];
  688. //
  689. //
  690. // DebugLog(@"url: %@",url);
  691. //
  692. // DebugLog(@"response: %@",[NSHTTPURLResponse localizedStringForStatusCode:urlResponse.statusCode]);
  693. //
  694. //
  695. // NSLog(@"get response");
  696. // if (responseData==nil) {
  697. //
  698. // // DebugLog(@"response error:%@", [error localizedDescription]);
  699. //
  700. //
  701. // NSMutableDictionary* ret = [[NSMutableDictionary alloc] init];
  702. // //#define RESULT_FALSE 0
  703. // //#define RESULT_TRUE 2
  704. // //#define RESULT_NET_ERROR -3
  705. // //#define RESULT_NET_NOTAVAILABLE -4
  706. // //#define RESULT_ERROR -5
  707. // //#define RESULT_LOCALFILE_ERROR -7
  708. // //#define RESULT_USERAUTH_ERROR -9
  709. // //#define RESULT_UPDATE_USERAUTH_ERROR -11
  710. // //#define RESULT_SESSION_EXPIRED -13
  711. // //#define RESULT_VER_LOW
  712. //
  713. // // NSString * moreinfo = error.description ;
  714. //
  715. // NSString* err_msg = [error localizedDescription];
  716. //
  717. //
  718. // //-----------------retry 3 times for error code -1005------------------------
  719. // if(error.code==-1005&&retry<3)
  720. // {
  721. // retry++;
  722. // goto repeat;
  723. //
  724. // }
  725. // //-----------------end retry 3 times for error code -1005------------------------
  726. //
  727. // NSDictionary* error_json = [RAUtils error_dict:error];
  728. // [ret setObject:error_json forKey:@"err_obj"];
  729. // NSString* resp_msg= nil;
  730. //
  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. //
  741. //
  742. // NSData *jsonData = [NSJSONSerialization dataWithJSONObject:ret
  743. // options:0
  744. // error:nil];
  745. // if(![url isEqualToString:recorder_url])
  746. // {
  747. // [self err_log:[RAUtils base64en:[RAConvertor dict2string:params]] result:[RAUtils base64en:[RAConvertor dict2string:ret]] module:url code:RESULT_NET_ERROR];
  748. // }
  749. // return jsonData;
  750. //
  751. // }
  752. // else
  753. // {
  754. // // NSString* err_msg = [error localizedDescription];
  755. // NSMutableString *str = [[NSMutableString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
  756. //
  757. // DebugLog(@"data string: %@",str);
  758. // NSError *error1 = nil;
  759. //
  760. // NSMutableDictionary* jsobj = [[NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers error:&error1] mutableCopy];
  761. //
  762. // if(jsobj==nil)// 服务器返回不是json
  763. // {
  764. //
  765. // jsobj=[[NSMutableDictionary alloc] init];
  766. // [jsobj setValue:[NSNumber numberWithInt:RESULT_NO_RESPONSE] forKey:@"result"];
  767. //
  768. // }
  769. //// if([jsobj[@"encrypt"] boolValue]==true)
  770. //// {
  771. //// jsobj = decryptBlock(jsobj);
  772. //// }
  773. //// if (resultBlock) {
  774. //// jsobj = resultBlock(jsobj);
  775. //// }
  776. //
  777. // int result=[[jsobj valueForKey:@"result"] intValue];
  778. // if(![url isEqualToString:recorder_url]&&/*![url isEqualToString:URL_DOWNLOAD_OFFLINE]&&*/result!=2&&result!=99)
  779. // {
  780. // [self err_log:[RAUtils base64en:[RAConvertor dict2string:params]] result:[RAUtils base64en:str] module:url code:result];
  781. // }
  782. // NSData *jsonData = [NSJSONSerialization dataWithJSONObject:jsobj
  783. // options:0
  784. // error:nil];
  785. // return jsonData;
  786. //
  787. // }
  788. // return responseData;
  789. // }
  790. }
  791. +(void)request_file_fast : (NSString*) url parameters:(NSMutableDictionary *) params completionHandler:(resultHandler)result
  792. // Param:(NSDictionary *)param from:(NSString *)url completionHandler:(resultHandler)result
  793. /* dataHandler:(dataHandler)returndata*/
  794. {
  795. if(![NetworkUtils IsNetworkAvailable])
  796. {
  797. dispatch_async(dispatch_get_main_queue(), ^{
  798. if(result)
  799. result([[RAConvertor string2dict:[NSString stringWithFormat:@"{\"result\":%d,\"err_msg\":\"%@\"}",RESULT_NET_NOTAVAILABLE,NSLocalizedString(@"net_not_available", nil)]] mutableCopy]);
  800. });
  801. // return detailContent;
  802. return ;
  803. }
  804. params = [self prepare_additional_params:params];
  805. NSURLSession *urlSession = [self standSession];
  806. // RANetworkTaskDelegate *delegate = (RANetworkTaskDelegate *)urlSession.delegate;
  807. // delegate.downloadTask = YES;
  808. // delegate.fileCachePath = path;
  809. // if (progressHandler) {
  810. // delegate.p = progressHandler;
  811. // }
  812. //
  813. // if (result) {
  814. // delegate.r = result;
  815. // }
  816. NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]];
  817. request.HTTPMethod = @"Post";
  818. //
  819. // if (offset > 0) {
  820. // [request addValue:[NSString stringWithFormat:@"bytes=%ld-",(unsigned long)offset] forHTTPHeaderField:@"Range"];
  821. // }
  822. // 拼接参数
  823. if (params && params.allValues.count > 0) {
  824. __block NSMutableArray *paramArr = [NSMutableArray array];
  825. [params enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
  826. [paramArr addObject:[NSString stringWithFormat:@"%@=%@",key,obj]];
  827. }];
  828. NSString *paramStr = [paramArr componentsJoinedByString:@"&"];
  829. request.HTTPBody = [paramStr dataUsingEncoding:NSUTF8StringEncoding];
  830. }
  831. NSURLSessionDownloadTask* downloadTask=[urlSession downloadTaskWithRequest:request completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {
  832. NSHTTPURLResponse* urlResponse =(NSHTTPURLResponse*)response;
  833. NSData* data =[NSData dataWithContentsOfURL:location] ;
  834. NSMutableDictionary* ret = [[NSMutableDictionary alloc] init];
  835. if(data==nil)
  836. {
  837. NSString* err_msg = [error localizedDescription];
  838. NSDictionary* error_json = [RAUtils error_dict:error];
  839. [ret setObject:error_json forKey:@"err_obj"];
  840. NSString* resp_msg= nil;
  841. if(err_msg.length==0)
  842. {
  843. err_msg =[NSHTTPURLResponse localizedStringForStatusCode:urlResponse.statusCode];
  844. resp_msg = err_msg;
  845. }
  846. [ret setValue:[NSString stringWithFormat:@"%d",RESULT_NET_ERROR] forKey:@"result"];
  847. [ret setValue:err_msg forKey:@"err_msg"];
  848. [ret setValue:resp_msg forKey:@"resp_msg"];
  849. [ret setValue:[NSString stringWithFormat:@"%ld",(long)urlResponse.statusCode] forKey:@"resp_code"];
  850. dispatch_async(dispatch_get_main_queue(), ^{
  851. if(result)
  852. result(ret);
  853. });
  854. }
  855. else
  856. {
  857. NSString* path=NSTemporaryDirectory();
  858. if (response.suggestedFilename) {
  859. path = [path stringByAppendingPathComponent:response.suggestedFilename];
  860. } else {
  861. path = [path stringByAppendingPathComponent:[NSUUID UUID].UUIDString];
  862. }
  863. NSError *error = nil;
  864. if([[NSFileManager defaultManager] fileExistsAtPath:path])
  865. {
  866. [[NSFileManager defaultManager] removeItemAtPath:path error:nil];
  867. }
  868. [[NSFileManager defaultManager] copyItemAtPath:location.path toPath:path error:&error];
  869. // [[NSFileManager defaultManager] copyItemAtURL:[NSURL URLWithString:location.path] toURL:[NSURL URLWithString:path] error:&error];
  870. // NSFileManager
  871. // NSString *cacheDir = NSTemporaryDirectory();
  872. //
  873. // if (![[NSFileManager defaultManager] fileExistsAtPath:cacheDir]) {
  874. // [[NSFileManager defaultManager] createDirectoryAtPath:cacheDir withIntermediateDirectories:NO attributes:nil error:nil];
  875. // }
  876. ret[@"suggestedFilename"]=response.suggestedFilename;
  877. ret[@"result"]=@"2";
  878. ret[@"data"]=data;
  879. ret[@"path"]=path;//[location absoluteString];
  880. dispatch_async(dispatch_get_main_queue(), ^{
  881. if(result)
  882. result(ret);
  883. });
  884. }
  885. // if(returndata)
  886. // {
  887. // returndata(data);
  888. // }
  889. }];
  890. [downloadTask resume];
  891. return ;
  892. }
  893. +(void)request_upload_fast :(NSData *)filedata FileName:(NSString*) filename server:(NSString*) urlString parameters:(NSMutableDictionary *) params completionHandler:(resultHandler)result
  894. {
  895. // NSString *fileName = [filePath lastPathComponent];
  896. DebugLog(urlString);
  897. NSMutableData *dataM = [NSMutableData data];
  898. NSMutableString *stringM = [NSMutableString string];
  899. DebugLog(@"================parms==================");
  900. for (NSString *key in params) {
  901. [stringM appendString:[NSString stringWithFormat:@"--%@\r\n",BOUNDARY]];
  902. [stringM appendFormat:@"Content-Type: text/plain; charset=UTF-8\r\n"];
  903. [stringM appendFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n",key];
  904. [stringM appendFormat:@"%@\r\n",[params objectForKey:key]];
  905. DebugLog(@"parameter: key=%@ value=%@",key,[params objectForKey:key]);
  906. }
  907. DebugLog(@"================parms==================");
  908. // Apex Drivers 2018.5.5
  909. if (filedata) {
  910. [stringM appendString:[NSString stringWithFormat:@"--%@\r\n",BOUNDARY]];
  911. [stringM appendFormat:@"Content-Disposition: form-data; name=\"upfile\"; filename=%@\r\n",filename];
  912. [stringM appendString:@"Content-Type: application/mac-binary\r\n"];
  913. [stringM appendString:@"\r\n"];
  914. NSData *stringM_data = [stringM dataUsingEncoding:NSUTF8StringEncoding];
  915. [dataM appendData:stringM_data];
  916. // NSData *file_data = [NSData dataWithContentsOfFile:filePath];
  917. [dataM appendData:filedata];
  918. NSString *end = [NSString stringWithFormat:@"\r\n--%@--",BOUNDARY];
  919. [dataM appendData:[end dataUsingEncoding:NSUTF8StringEncoding]];
  920. } else {
  921. NSData *stringM_data = [stringM dataUsingEncoding:NSUTF8StringEncoding];
  922. [dataM appendData:stringM_data];
  923. NSString *end = [NSString stringWithFormat:@"\r\n--%@--",BOUNDARY];
  924. [dataM appendData:[end dataUsingEncoding:NSUTF8StringEncoding]];
  925. }
  926. // Data
  927. NSData *data = dataM;
  928. // 可变请求
  929. NSURL *url = [NSURL URLWithString:urlString];
  930. NSMutableURLRequest *requestM = [NSMutableURLRequest requestWithURL:url
  931. cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:JSON_TIMEOUT];
  932. // line note
  933. requestM.HTTPMethod = @"POST";
  934. // request header
  935. [requestM addValue:@"close" forHTTPHeaderField:@"Connection"];
  936. [requestM addValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@",BOUNDARY] forHTTPHeaderField:@"Content-Type"];
  937. [requestM addValue:@"multipart/form-data" forHTTPHeaderField:@"enctype"];
  938. [requestM addValue:[NSString stringWithFormat:@"%lu", (unsigned long)[data length]] forHTTPHeaderField:@"Content-Length"];
  939. // request body
  940. requestM.HTTPBody = data;
  941. NSURLSession *urlSession = [self standSession];
  942. // if (urlSession.delegate) {
  943. // if ([urlSession.delegate isKindOfClass:[RANetworkTaskDelegate class]]) {
  944. //
  945. // RANetworkTaskDelegate *delegate = (RANetworkTaskDelegate *)urlSession.delegate;
  946. //
  947. // if (p) {
  948. // delegate.p = p;
  949. // }
  950. //
  951. // if (r) {
  952. // delegate.r = r;
  953. // }
  954. //
  955. // if (decrypt) {
  956. // delegate.decryptHandler = decrypt;
  957. // }
  958. //
  959. // }
  960. // }
  961. // NSURLSessionDataTask *dataTask = [urlSession uploadTaskWithRequest:requestM fromData:data];
  962. // [urlSession uploadTaskWithRequest:<#(nonnull NSURLRequest *)#> fromData:<#(nullable NSData *)#> completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
  963. // <#code#>
  964. // }];
  965. // [urlSession uploadTaskWithRequest:<#(nonnull NSURLRequest *)#> fromFile:<#(nonnull NSURL *)#> completionHandler:<#^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error)completionHandler#>]
  966. NSURLSessionUploadTask *uploadTask = [urlSession uploadTaskWithRequest:requestM fromData:data completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
  967. NSData *responseData =data;
  968. NSHTTPURLResponse* urlResponse =(NSHTTPURLResponse*)response;
  969. if (responseData==nil) {
  970. DebugLog(@"request_upload_fast error:%@", [error localizedDescription]);
  971. NSMutableDictionary* ret = [[NSMutableDictionary alloc] init];
  972. //#define RESULT_FALSE 0
  973. //#define RESULT_TRUE 2
  974. //#define RESULT_NET_ERROR -3
  975. //#define RESULT_NET_NOTAVAILABLE -4
  976. //#define RESULT_ERROR -5
  977. //#define RESULT_LOCALFILE_ERROR -7
  978. //#define RESULT_USERAUTH_ERROR -9
  979. //#define RESULT_UPDATE_USERAUTH_ERROR -11
  980. //#define RESULT_SESSION_EXPIRED -13
  981. //#define RESULT_VER_LOW
  982. // NSString * moreinfo = error.description ;
  983. NSString* err_msg = [error localizedDescription];
  984. // //-----------------retry 3 times for error code -1005------------------------
  985. // if(error.code==-1005&&retry<3)
  986. // {
  987. // int new_retry=retry+1;
  988. // [self request_interface:url parameters:params err_record_url:recorder_url completionHandler:result retry:new_retry];
  989. // return;
  990. // // retry++;
  991. // // goto repeat;
  992. //
  993. // }
  994. //-----------------end retry 3 times for error code -1005------------------------
  995. NSDictionary* error_json = [RAUtils error_dict:error];
  996. [ret setObject:error_json forKey:@"err_obj"];
  997. NSString* resp_msg= nil;
  998. if(err_msg.length==0)
  999. {
  1000. err_msg =[NSHTTPURLResponse localizedStringForStatusCode:urlResponse.statusCode];
  1001. resp_msg = err_msg;
  1002. }
  1003. [ret setValue:[NSString stringWithFormat:@"%d",RESULT_NET_ERROR] forKey:@"result"];
  1004. [ret setValue:err_msg forKey:@"err_msg"];
  1005. [ret setValue:resp_msg forKey:@"resp_msg"];
  1006. [ret setValue:[NSString stringWithFormat:@"%ld",(long)urlResponse.statusCode] forKey:@"resp_code"];
  1007. NSData *jsonData = [NSJSONSerialization dataWithJSONObject:ret
  1008. options:0
  1009. error:nil];
  1010. // if(![urlString isEqualToString:recorder_url])
  1011. // {
  1012. // [self err_log:[RAUtils base64en:[RAConvertor dict2string:params]] result:[RAUtils base64en:[RAConvertor dict2string:ret]] module:url code:RESULT_NET_ERROR];
  1013. // }
  1014. dispatch_async(dispatch_get_main_queue(), ^{
  1015. if(result)
  1016. return result([[RAConvertor data2dict:jsonData] mutableCopy]);
  1017. });
  1018. }
  1019. else
  1020. {
  1021. NSString *str = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
  1022. DebugLog(@"request_upload_fast result:%@", str);
  1023. NSMutableDictionary* dict =[[RAConvertor data2dict:responseData] mutableCopy];
  1024. if([dict[@"result"] intValue]==RESULT_USERAUTH_ERROR)
  1025. {
  1026. dict[@"err_msg"]=@"Authorization failed.";
  1027. }
  1028. // 兼容不同后台的错误消息反馈
  1029. if([dict[@"result"] intValue]!=RESULT_TRUE&&dict[@"msg"]!=nil && dict[@"err_msg"]==nil)
  1030. {
  1031. dict[@"err_msg"]=dict[@"msg"];
  1032. }
  1033. if([dict[@"result"] intValue]!=RESULT_TRUE&&dict[@"message"]!=nil && dict[@"err_msg"]==nil)
  1034. {
  1035. dict[@"err_msg"]=dict[@"message"];
  1036. }
  1037. if(dict==nil)
  1038. {
  1039. dict= [NSMutableDictionary new];
  1040. dict[@"result"]=@9;
  1041. dict[@"err_msg"]=@"Sorry, can not access server, please contact support.";
  1042. }
  1043. // if([dict[@"result"] intValue]==RESULT_ERROR)
  1044. // {
  1045. //// RESULT_ERROR
  1046. // }
  1047. dispatch_async(dispatch_get_main_queue(), ^{
  1048. if(result)
  1049. return result(dict);
  1050. });
  1051. }
  1052. }];
  1053. [uploadTask resume];
  1054. }
  1055. @end