NetworkUtils.m 44 KB

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