NetworkUtils.m 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491
  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 "RAConvertor.h"
  13. #define BOUNDARY @"AaB03x"
  14. @implementation NetworkUtils
  15. //+(NSDictionary*) error_dict:(NSError*)error
  16. //{
  17. // if(error==nil)
  18. // return nil;
  19. // NSMutableDictionary* ret = [[NSMutableDictionary alloc] init];
  20. // [ret setValue:[NSString stringWithFormat:@"%d",error.code] forKey:@"error_code"];
  21. // [ret setValue:error.domain forKey:@"err_domain"];
  22. // [ret setValue:[error localizedDescription] forKey:@"err_message"];
  23. // // [ret setObject:error.userInfo forKey:@"user_info"];
  24. // return ret;
  25. //}
  26. +(bool) IsNetworkAvailable
  27. {
  28. if (([Reachability reachabilityForInternetConnection].currentReachabilityStatus == NotReachable) &&
  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. // 关闭keep alive
  106. [request setValue:@"close" forHTTPHeaderField:@"Connection"];
  107. //设置Content-Length
  108. [request setValue:[NSString stringWithFormat:@"%lu", (unsigned long)[myRequestData length]] forHTTPHeaderField:@"Content-Length"];
  109. //设置http body
  110. [request setHTTPBody:myRequestData];
  111. //http method
  112. [request setHTTPMethod:@"POST"];
  113. NSHTTPURLResponse* urlResponse = nil;
  114. NSError *error = nil;
  115. NSLog(@"begin request");
  116. NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&error];
  117. DebugLog(@"url: %@",url);
  118. DebugLog(@"response: %@",[NSHTTPURLResponse localizedStringForStatusCode:urlResponse.statusCode]);
  119. NSLog(@"get response");
  120. if (responseData==nil) {
  121. // DebugLog(@"response error:%@", [error localizedDescription]);
  122. NSMutableDictionary* ret = [[NSMutableDictionary alloc] init];
  123. //#define RESULT_FALSE 0
  124. //#define RESULT_TRUE 2
  125. //#define RESULT_NET_ERROR -3
  126. //#define RESULT_NET_NOTAVAILABLE -4
  127. //#define RESULT_ERROR -5
  128. //#define RESULT_LOCALFILE_ERROR -7
  129. //#define RESULT_USERAUTH_ERROR -9
  130. //#define RESULT_UPDATE_USERAUTH_ERROR -11
  131. //#define RESULT_SESSION_EXPIRED -13
  132. //#define RESULT_VER_LOW
  133. // NSString * moreinfo = error.description ;
  134. NSString* err_msg = [error localizedDescription];
  135. //-----------------retry 3 times for error code -1005------------------------
  136. if(error.code==-1005&&retry<3)
  137. {
  138. retry++;
  139. goto repeat;
  140. }
  141. //-----------------end retry 3 times for error code -1005------------------------
  142. NSDictionary* error_json = [RAUtils error_dict:error];
  143. [ret setObject:error_json forKey:@"err_obj"];
  144. NSString* resp_msg= nil;
  145. if(err_msg.length==0)
  146. {
  147. err_msg =[NSHTTPURLResponse localizedStringForStatusCode:urlResponse.statusCode];
  148. resp_msg = err_msg;
  149. }
  150. [ret setValue:[NSString stringWithFormat:@"%d",RESULT_NET_ERROR] forKey:@"result"];
  151. [ret setValue:err_msg forKey:@"err_msg"];
  152. [ret setValue:resp_msg forKey:@"resp_msg"];
  153. [ret setValue:[NSString stringWithFormat:@"%ld",(long)urlResponse.statusCode] forKey:@"resp_code"];
  154. NSData *jsonData = [NSJSONSerialization dataWithJSONObject:ret
  155. options:0
  156. error:nil];
  157. if(![url isEqualToString:recorder_url])
  158. {
  159. [self err_log:[RAUtils base64en:[RAConvertor dict2string:params]] result:[RAUtils base64en:[RAConvertor dict2string:ret]] module:url code:RESULT_NET_ERROR];
  160. }
  161. return jsonData;
  162. }
  163. else
  164. {
  165. // NSString* err_msg = [error localizedDescription];
  166. NSMutableString *str = [[NSMutableString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
  167. DebugLog(@"data string: %@",str);
  168. NSError *error1 = nil;
  169. NSMutableDictionary* jsobj = [[NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers error:&error1] mutableCopy];
  170. if(jsobj==nil)// 服务器返回不是json
  171. {
  172. jsobj=[[NSMutableDictionary alloc] init];
  173. [jsobj setValue:@"1" forKey:@"result"];
  174. }
  175. if([jsobj[@"encrypt"] boolValue]==true)
  176. {
  177. jsobj = decryptBlock(jsobj);
  178. }
  179. jsobj = resultBlock(jsobj);
  180. int result=[[jsobj valueForKey:@"result"] intValue];
  181. if(![url isEqualToString:recorder_url]&&/*![url isEqualToString:URL_DOWNLOAD_OFFLINE]&&*/result!=2&&result!=99)
  182. {
  183. [self err_log:[RAUtils base64en:[RAConvertor dict2string:params]] result:[RAUtils base64en:str] module:url code:result];
  184. }
  185. NSData *jsonData = [NSJSONSerialization dataWithJSONObject:jsobj
  186. options:0
  187. error:nil];
  188. return jsonData;
  189. }
  190. return responseData;
  191. }
  192. }
  193. +(NSDictionary*)err_log:(NSString*) up_params result:(NSString*)result module:(NSString*) module code:(int) code//device:(NSString*) device
  194. {
  195. // NSMutableDictionary* params = [[NSMutableDictionary alloc] init];
  196. // AppDelegate *appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
  197. // if(appDelegate.user!=nil)
  198. // [params setValue:appDelegate.user forKey:@"user"];
  199. //
  200. // [params setValue:up_params forKey:@"upparam"];
  201. //
  202. // [params setValue:[NSNumber numberWithInt:code ] forKey:@"code"];
  203. //
  204. // [params setValue:result forKey:@"result"];
  205. // [params setValue:module forKey:@"interfac"];
  206. //
  207. // [params setValue:[RAUtils base64en:[RAUtils dict2string: [RAUtils device_info]]] forKey:@"device"];
  208. //
  209. //
  210. // // [params setValue:module forKey:@"module"];
  211. //
  212. // // [[UIDevice currentDevice] name];
  213. //
  214. // // if(appDelegate.offline_mode)
  215. // // {
  216. // // return [OLDataProvider offline_notimpl];
  217. // // }
  218. // if(![self IsNetworkAvailable])
  219. // return [RAUtils error_json:RESULT_NET_NOTAVAILABLE err_msg:nil];
  220. //
  221. // NSData* json=[self get_json:URL_ERR_LOG parameters:params];
  222. // if(json==nil)
  223. // return nil;
  224. // NSError *error=nil;
  225. // NSDictionary *jsobj = [NSJSONSerialization JSONObjectWithData:json options:NSJSONReadingMutableLeaves error:&error];
  226. // return jsobj;
  227. NSMutableDictionary* jsobj = [@{@"result":@"2"} mutableCopy];
  228. return jsobj;
  229. }
  230. + (NSURLSessionTask *)upload:(NSData *)filedata FileName:(NSString*) filename Params:(NSDictionary *)params ToHost:(NSString *)urlString Result:(resultHandler)r Progress:(progressHandler)p DecryptHandler:(id (^)(NSString *))decrypt {
  231. // NSString *fileName = [filePath lastPathComponent];
  232. NSMutableData *dataM = [NSMutableData data];
  233. NSMutableString *stringM = [NSMutableString string];
  234. DebugLog(@"================parms==================");
  235. for (NSString *key in params) {
  236. [stringM appendString:[NSString stringWithFormat:@"--%@\r\n",BOUNDARY]];
  237. [stringM appendFormat:@"Content-Type: text/plain; charset=UTF-8\r\n"];
  238. [stringM appendFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n",key];
  239. [stringM appendFormat:@"%@\r\n",[params objectForKey:key]];
  240. DebugLog(@"parameter: key=%@ value=%@",key,[params objectForKey:key]);
  241. }
  242. DebugLog(@"================parms==================");
  243. [stringM appendString:[NSString stringWithFormat:@"--%@\r\n",BOUNDARY]];
  244. [stringM appendFormat:@"Content-Disposition: form-data; name=\"upfile\"; filename=%@\r\n",filename];
  245. [stringM appendString:@"Content-Type: application/mac-binary\r\n"];
  246. [stringM appendString:@"\r\n"];
  247. NSData *stringM_data = [stringM dataUsingEncoding:NSUTF8StringEncoding];
  248. [dataM appendData:stringM_data];
  249. // NSData *file_data = [NSData dataWithContentsOfFile:filePath];
  250. [dataM appendData:filedata];
  251. NSString *end = [NSString stringWithFormat:@"\r\n--%@--",BOUNDARY];
  252. [dataM appendData:[end dataUsingEncoding:NSUTF8StringEncoding]];
  253. // Data
  254. NSData *data = dataM;
  255. // 可变请求
  256. NSURL *url = [NSURL URLWithString:urlString];
  257. NSMutableURLRequest *requestM = [NSMutableURLRequest requestWithURL:url
  258. cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:JSON_TIMEOUT];
  259. // line note
  260. requestM.HTTPMethod = @"POST";
  261. // request header
  262. [requestM addValue:@"close" forHTTPHeaderField:@"Connection"];
  263. [requestM addValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@",BOUNDARY] forHTTPHeaderField:@"Content-Type"];
  264. [requestM addValue:[NSString stringWithFormat:@"%lu", (unsigned long)[data length]] forHTTPHeaderField:@"Content-Length"];
  265. // request body
  266. requestM.HTTPBody = data;
  267. NSURLSession *urlSession = [self standSession];
  268. if (urlSession.delegate) {
  269. if ([urlSession.delegate isKindOfClass:[RANetworkTaskDelegate class]]) {
  270. RANetworkTaskDelegate *delegate = (RANetworkTaskDelegate *)urlSession.delegate;
  271. if (p) {
  272. delegate.p = p;
  273. }
  274. if (r) {
  275. delegate.r = r;
  276. }
  277. if (decrypt) {
  278. delegate.decryptHandler = decrypt;
  279. }
  280. }
  281. }
  282. NSURLSessionDataTask *dataTask = [urlSession uploadTaskWithRequest:requestM fromData:data];
  283. [dataTask resume];
  284. return dataTask;
  285. }
  286. + (NSURLSessionTask *)upload:(NSString *)filePath Params:(NSDictionary *)params ToHost:(NSString *)urlString Result:(resultHandler)r Progress:(progressHandler)p DecryptHandler:(id (^)(NSString *))decrypt {
  287. NSString *fileName = [filePath lastPathComponent];
  288. NSData *file_data = [NSData dataWithContentsOfFile:filePath];
  289. return [self upload:file_data FileName:fileName Params:params ToHost:urlString Result:r Progress:p DecryptHandler:decrypt];
  290. //
  291. // NSMutableData *dataM = [NSMutableData data];
  292. //
  293. // NSMutableString *stringM = [NSMutableString string];
  294. //
  295. //
  296. // DebugLog(@"================parms==================");
  297. //
  298. //
  299. //
  300. // for (NSString *key in params) {
  301. //
  302. // [stringM appendString:[NSString stringWithFormat:@"--%@\r\n",BOUNDARY]];
  303. // [stringM appendFormat:@"Content-Type: text/plain; charset=UTF-8\r\n"];
  304. // [stringM appendFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n",key];
  305. // [stringM appendFormat:@"%@\r\n",[params objectForKey:key]];
  306. //
  307. //
  308. // DebugLog(@"parameter: key=%@ value=%@",key,[params objectForKey:key]);
  309. // }
  310. // DebugLog(@"================parms==================");
  311. // [stringM appendString:[NSString stringWithFormat:@"--%@\r\n",BOUNDARY]];
  312. //
  313. // [stringM appendFormat:@"Content-Disposition: form-data; name=\"upfile\"; filename=%@\r\n",fileName];
  314. // [stringM appendString:@"Content-Type: application/mac-binary\r\n"];
  315. // [stringM appendString:@"\r\n"];
  316. //
  317. // NSData *stringM_data = [stringM dataUsingEncoding:NSUTF8StringEncoding];
  318. // [dataM appendData:stringM_data];
  319. //
  320. // NSData *file_data = [NSData dataWithContentsOfFile:filePath];
  321. // [dataM appendData:file_data];
  322. //
  323. // NSString *end = [NSString stringWithFormat:@"\r\n--%@--",BOUNDARY];
  324. // [dataM appendData:[end dataUsingEncoding:NSUTF8StringEncoding]];
  325. //
  326. // // Data
  327. // NSData *data = dataM;
  328. //
  329. //
  330. // // 可变请求
  331. // NSURL *url = [NSURL URLWithString:urlString];
  332. // NSMutableURLRequest *requestM = [NSMutableURLRequest requestWithURL:url
  333. // cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:JSON_TIMEOUT];
  334. // // line note
  335. // requestM.HTTPMethod = @"POST";
  336. //
  337. // // request header
  338. // [requestM addValue:@"close" forHTTPHeaderField:@"Connection"];
  339. //
  340. // [requestM addValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@",BOUNDARY] forHTTPHeaderField:@"Content-Type"];
  341. //
  342. // [requestM addValue:[NSString stringWithFormat:@"%lu", (unsigned long)[data length]] forHTTPHeaderField:@"Content-Length"];
  343. //
  344. // // request body
  345. // requestM.HTTPBody = data;
  346. //
  347. //
  348. //
  349. // NSURLSession *urlSession = [self standSession];
  350. //
  351. // if (urlSession.delegate) {
  352. // if ([urlSession.delegate isKindOfClass:[RANetworkTaskDelegate class]]) {
  353. //
  354. // RANetworkTaskDelegate *delegate = (RANetworkTaskDelegate *)urlSession.delegate;
  355. //
  356. // if (p) {
  357. // delegate.p = p;
  358. // }
  359. //
  360. // if (r) {
  361. // delegate.r = r;
  362. // }
  363. //
  364. // if (decrypt) {
  365. // delegate.decryptHandler = decrypt;
  366. // }
  367. //
  368. // }
  369. // }
  370. //
  371. // NSURLSessionDataTask *dataTask = [urlSession uploadTaskWithRequest:requestM fromData:data];
  372. //
  373. // [dataTask resume];
  374. //
  375. // return dataTask;
  376. }
  377. + (NSURLSession *)standSession {
  378. NSURLSession *session = nil;
  379. RANetworkTaskDelegate *delegate = [RANetworkTaskDelegate sharedInstance];
  380. NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
  381. config.timeoutIntervalForRequest = JSON_TIMEOUT;
  382. NSOperationQueue *queue = [[NSOperationQueue alloc] init];
  383. session = [NSURLSession sessionWithConfiguration:config delegate:delegate delegateQueue:queue];
  384. return session;
  385. }
  386. @end