NetworkUtils.m 53 KB

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