NetworkUtils.m 51 KB

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