// // NetworkUtils.m // AntsContract // // Created by Ray on 12/26/16. // Copyright © 2016 United Software Applications, Inc. All rights reserved. // #import "NetworkUtils.h" #import "RAUtils.h" #import "Reachability.h" #import "RANetworkTaskDelegate.h" #import "common_const.h" #import "config.h" #define BOUNDARY @"AaB03x" @implementation NetworkUtils //+(NSDictionary*) error_dict:(NSError*)error //{ // if(error==nil) // return nil; // NSMutableDictionary* ret = [[NSMutableDictionary alloc] init]; // [ret setValue:[NSString stringWithFormat:@"%d",error.code] forKey:@"error_code"]; // [ret setValue:error.domain forKey:@"err_domain"]; // [ret setValue:[error localizedDescription] forKey:@"err_message"]; // // [ret setObject:error.userInfo forKey:@"user_info"]; // return ret; //} +(bool) IsNetworkAvailable { if (([Reachability reachabilityForInternetConnection].currentReachabilityStatus == NotReachable) /* && ([Reachability reachabilityForLocalWiFi].currentReachabilityStatus == NotReachable)*/) return false; return true; } +(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 { #ifndef GET_JSON NSAssert(false, @"The get_json is obsolete, use the request_interface instead"); return nil; #else int retry = 0; repeat: { // return [self fake_json:url]; // AppDelegate *appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate]; //分界线的标识符 NSString *TWITTERFON_FORM_BOUNDARY = @"AaB03x"; //根据url初始化request NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url] cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:JSON_TIMEOUT]; //分界线 --AaB03x NSString *MPboundary=[[NSString alloc]initWithFormat:@"--%@",TWITTERFON_FORM_BOUNDARY]; //结束符 AaB03x-- NSString *endMPboundary=[[NSString alloc]initWithFormat:@"%@--",MPboundary]; //要上传的图片 // UIImage *image=[params objectForKey:@"pic"]; //得到图片的data NSData* data = [NSData dataWithContentsOfFile:file_path]; //http body的字符串 NSMutableString *body=[[NSMutableString alloc]init]; // NSMutableDictionary* params = [[NSMutableDictionary alloc] init]; // [params setValue:@"handset_login" forKey:@"action"]; // [headers setValue:[NSString stringWithFormat:@"%d",dataLength] forKey:@"Content-Length"]; // [params setValue:appDelegate.sessionid forKey:@"sessionid"]; // [params setValue:password forKey:@"password"]; // [params setValue:[NSString stringWithFormat:@"%d",ver] forKey:@"auth_ver"]; // [headers setValue:headQuerlString forKey:@"param"]; //参数的集合的所有key的集合 NSArray *keys= [params allKeys]; DebugLog(@"================parms=================="); //遍历keys for(int i=0;i<[keys count];i++) { //得到当前key NSString *key=[keys objectAtIndex:i]; //如果key不是pic,说明value是字符类型,比如name:Boris if(![key isEqualToString:@"pic"]) { //添加分界线,换行 [body appendFormat:@"%@\r\n",MPboundary]; //添加字段名称,换2行 [body appendFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n",key]; //添加字段的值 [body appendFormat:@"%@\r\n",[params objectForKey:key]]; DebugLog(@"parameter: key=%@ value=%@",key,[params objectForKey:key]); } } DebugLog(@"================parms=================="); ////添加分界线,换行 [body appendFormat:@"%@\r\n",MPboundary]; //声明pic字段,文件名为boris.png NSString * file_format=[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"upfile\"; filename=\"%@\"\r\n", [file_path lastPathComponent]]; [body appendFormat:@"%@", file_format]; //声明上传文件的格式 [body appendFormat:@"Content-Type: application/zip\r\n\r\n"]; //声明结束符:--AaB03x-- NSString *end=[[NSString alloc]initWithFormat:@"\r\n%@",endMPboundary]; //声明myRequestData,用来放入http body NSMutableData *myRequestData=[NSMutableData data]; //将body字符串转化为UTF8格式的二进制 [myRequestData appendData:[body dataUsingEncoding:NSUTF8StringEncoding]]; //将image的data加入 [myRequestData appendData:data]; //加入结束符--AaB03x-- [myRequestData appendData:[end dataUsingEncoding:NSUTF8StringEncoding]]; //设置HTTPHeader中Content-Type的值 NSString *content=[[NSString alloc]initWithFormat:@"multipart/form-data; boundary=%@",TWITTERFON_FORM_BOUNDARY]; //设置HTTPHeader [request setValue:content forHTTPHeaderField:@"Content-Type"]; [request setValue:@"multipart/form-data" forHTTPHeaderField:@"enctype"]; // 关闭keep alive [request setValue:@"close" forHTTPHeaderField:@"Connection"]; //设置Content-Length [request setValue:[NSString stringWithFormat:@"%lu", (unsigned long)[myRequestData length]] forHTTPHeaderField:@"Content-Length"]; //设置http body [request setHTTPBody:myRequestData]; //http method [request setHTTPMethod:@"POST"]; NSLog(@"%@", [[NSString alloc] initWithData:myRequestData encoding:NSUTF8StringEncoding]); NSHTTPURLResponse* urlResponse = nil; NSError *error = nil; NSLog(@"begin request %@",url); NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&error]; DebugLog(@"url: %@",url); DebugLog(@"response: %@",[NSHTTPURLResponse localizedStringForStatusCode:urlResponse.statusCode]); NSLog(@"get response"); if (responseData==nil) { // DebugLog(@"response error:%@", [error localizedDescription]); NSMutableDictionary* ret = [[NSMutableDictionary alloc] init]; //#define RESULT_FALSE 0 //#define RESULT_TRUE 2 //#define RESULT_NET_ERROR -3 //#define RESULT_NET_NOTAVAILABLE -4 //#define RESULT_ERROR -5 //#define RESULT_LOCALFILE_ERROR -7 //#define RESULT_USERAUTH_ERROR -9 //#define RESULT_UPDATE_USERAUTH_ERROR -11 //#define RESULT_SESSION_EXPIRED -13 //#define RESULT_VER_LOW // NSString * moreinfo = error.description ; NSString* err_msg = [error localizedDescription]; //-----------------retry 3 times for error code -1005------------------------ if(error.code==-1005&&retry<3) { retry++; goto repeat; } //-----------------end retry 3 times for error code -1005------------------------ NSDictionary* error_json = [RAUtils error_dict:error]; [ret setObject:error_json forKey:@"err_obj"]; NSString* resp_msg= nil; if(err_msg.length==0) { err_msg =[NSHTTPURLResponse localizedStringForStatusCode:urlResponse.statusCode]; resp_msg = err_msg; } [ret setValue:[NSString stringWithFormat:@"%d",RESULT_NET_ERROR] forKey:@"result"]; [ret setValue:err_msg forKey:@"err_msg"]; [ret setValue:resp_msg forKey:@"resp_msg"]; [ret setValue:[NSString stringWithFormat:@"%ld",(long)urlResponse.statusCode] forKey:@"resp_code"]; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:ret options:0 error:nil]; if(![url isEqualToString:recorder_url]) { [self err_log:[RAUtils base64en:[RAConvertor dict2string:params]] result:[RAUtils base64en:[RAConvertor dict2string:ret]] module:url code:RESULT_NET_ERROR]; } return jsonData; } else { // NSString* err_msg = [error localizedDescription]; NSMutableString *str = [[NSMutableString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; DebugLog(@"data string: %@",str); NSError *error1 = nil; NSMutableDictionary* jsobj = [[NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers error:&error1] mutableCopy]; if(jsobj==nil)// 服务器返回不是json { jsobj=[[NSMutableDictionary alloc] init]; [jsobj setValue:[NSNumber numberWithInt:RESULT_NO_RESPONSE] forKey:@"result"]; } if([jsobj[@"encrypt"] boolValue]==true) { jsobj = decryptBlock(jsobj); } if (resultBlock) { jsobj = resultBlock(jsobj); } int result=[[jsobj valueForKey:@"result"] intValue]; if(![url isEqualToString:recorder_url]&&/*![url isEqualToString:URL_DOWNLOAD_OFFLINE]&&*/result!=2&&result!=99) { [self err_log:[RAUtils base64en:[RAConvertor dict2string:params]] result:[RAUtils base64en:str] module:url code:result]; } NSData *jsonData = [NSJSONSerialization dataWithJSONObject:jsobj options:0 error:nil]; return jsonData; } return responseData; } #endif } +(NSDictionary*)err_log:(NSString*) up_params result:(NSString*)result module:(NSString*) module code:(int) code//device:(NSString*) device { // NSMutableDictionary* params = [[NSMutableDictionary alloc] init]; // AppDelegate *appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate]; // if(appDelegate.user!=nil) // [params setValue:appDelegate.user forKey:@"user"]; // // [params setValue:up_params forKey:@"upparam"]; // // [params setValue:[NSNumber numberWithInt:code ] forKey:@"code"]; // // [params setValue:result forKey:@"result"]; // [params setValue:module forKey:@"interfac"]; // // [params setValue:[RAUtils base64en:[RAUtils dict2string: [RAUtils device_info]]] forKey:@"device"]; // // // // [params setValue:module forKey:@"module"]; // // // [[UIDevice currentDevice] name]; // // // if(appDelegate.offline_mode) // // { // // return [OLDataProvider offline_notimpl]; // // } // if(![self IsNetworkAvailable]) // return [RAUtils error_json:RESULT_NET_NOTAVAILABLE err_msg:nil]; // // NSData* json=[self get_json:URL_ERR_LOG parameters:params]; // if(json==nil) // return nil; // NSError *error=nil; // NSDictionary *jsobj = [NSJSONSerialization JSONObjectWithData:json options:NSJSONReadingMutableLeaves error:&error]; // return jsobj; // 子类没有处理err_log函数时的默认处理。 NSMutableDictionary* jsobj = [@{@"result":@"2"} mutableCopy]; return jsobj; } + (NSURLSessionTask *)upload:(NSData *)filedata FileName:(NSString*) filename Params:(NSDictionary *)params ToHost:(NSString *)urlString Result:(resultHandler)r Progress:(progressHandler)p DecryptHandler:(id (^)(NSString *))decrypt { // NSString *fileName = [filePath lastPathComponent]; NSMutableData *dataM = [NSMutableData data]; NSMutableString *stringM = [NSMutableString string]; DebugLog(@"================parms=================="); for (NSString *key in params) { [stringM appendString:[NSString stringWithFormat:@"--%@\r\n",BOUNDARY]]; [stringM appendFormat:@"Content-Type: text/plain; charset=UTF-8\r\n"]; [stringM appendFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n",key]; [stringM appendFormat:@"%@\r\n",[params objectForKey:key]]; DebugLog(@"parameter: key=%@ value=%@",key,[params objectForKey:key]); } DebugLog(@"================parms=================="); // Apex Drivers 2018.5.5 if (filedata) { [stringM appendString:[NSString stringWithFormat:@"--%@\r\n",BOUNDARY]]; [stringM appendFormat:@"Content-Disposition: form-data; name=\"upfile\"; filename=%@\r\n",filename]; [stringM appendString:@"Content-Type: application/mac-binary\r\n"]; [stringM appendString:@"\r\n"]; NSData *stringM_data = [stringM dataUsingEncoding:NSUTF8StringEncoding]; [dataM appendData:stringM_data]; // NSData *file_data = [NSData dataWithContentsOfFile:filePath]; [dataM appendData:filedata]; NSString *end = [NSString stringWithFormat:@"\r\n--%@--",BOUNDARY]; [dataM appendData:[end dataUsingEncoding:NSUTF8StringEncoding]]; } else { NSData *stringM_data = [stringM dataUsingEncoding:NSUTF8StringEncoding]; [dataM appendData:stringM_data]; NSString *end = [NSString stringWithFormat:@"\r\n--%@--",BOUNDARY]; [dataM appendData:[end dataUsingEncoding:NSUTF8StringEncoding]]; } // Data NSData *data = dataM; // 可变请求 NSURL *url = [NSURL URLWithString:urlString]; NSMutableURLRequest *requestM = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:JSON_TIMEOUT]; // line note requestM.HTTPMethod = @"POST"; // request header [requestM addValue:@"close" forHTTPHeaderField:@"Connection"]; [requestM addValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@",BOUNDARY] forHTTPHeaderField:@"Content-Type"]; [requestM addValue:@"multipart/form-data" forHTTPHeaderField:@"enctype"]; [requestM addValue:[NSString stringWithFormat:@"%lu", (unsigned long)[data length]] forHTTPHeaderField:@"Content-Length"]; // request body requestM.HTTPBody = data; NSURLSession *urlSession = [self standSession]; if (urlSession.delegate) { if ([urlSession.delegate isKindOfClass:[RANetworkTaskDelegate class]]) { RANetworkTaskDelegate *delegate = (RANetworkTaskDelegate *)urlSession.delegate; if (p) { delegate.p = p; } if (r) { delegate.r = r; } if (decrypt) { delegate.decryptHandler = decrypt; } } } NSURLSessionDataTask *dataTask = [urlSession uploadTaskWithRequest:requestM fromData:data]; [dataTask resume]; return dataTask; } + (NSURLSessionTask *)upload:(NSString *)filePath Params:(NSDictionary *)params ToHost:(NSString *)urlString Result:(resultHandler)r Progress:(progressHandler)p DecryptHandler:(id (^)(NSString *))decrypt { NSString *fileName = [filePath lastPathComponent]; NSData *file_data = [NSData dataWithContentsOfFile:filePath]; return [self upload:file_data FileName:fileName Params:params ToHost:urlString Result:r Progress:p DecryptHandler:decrypt]; // // NSMutableData *dataM = [NSMutableData data]; // // NSMutableString *stringM = [NSMutableString string]; // // // DebugLog(@"================parms=================="); // // // // for (NSString *key in params) { // // [stringM appendString:[NSString stringWithFormat:@"--%@\r\n",BOUNDARY]]; // [stringM appendFormat:@"Content-Type: text/plain; charset=UTF-8\r\n"]; // [stringM appendFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n",key]; // [stringM appendFormat:@"%@\r\n",[params objectForKey:key]]; // // // DebugLog(@"parameter: key=%@ value=%@",key,[params objectForKey:key]); // } // DebugLog(@"================parms=================="); // [stringM appendString:[NSString stringWithFormat:@"--%@\r\n",BOUNDARY]]; // // [stringM appendFormat:@"Content-Disposition: form-data; name=\"upfile\"; filename=%@\r\n",fileName]; // [stringM appendString:@"Content-Type: application/mac-binary\r\n"]; // [stringM appendString:@"\r\n"]; // // NSData *stringM_data = [stringM dataUsingEncoding:NSUTF8StringEncoding]; // [dataM appendData:stringM_data]; // // NSData *file_data = [NSData dataWithContentsOfFile:filePath]; // [dataM appendData:file_data]; // // NSString *end = [NSString stringWithFormat:@"\r\n--%@--",BOUNDARY]; // [dataM appendData:[end dataUsingEncoding:NSUTF8StringEncoding]]; // // // Data // NSData *data = dataM; // // // // 可变请求 // NSURL *url = [NSURL URLWithString:urlString]; // NSMutableURLRequest *requestM = [NSMutableURLRequest requestWithURL:url // cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:JSON_TIMEOUT]; // // line note // requestM.HTTPMethod = @"POST"; // // // request header // [requestM addValue:@"close" forHTTPHeaderField:@"Connection"]; // // [requestM addValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@",BOUNDARY] forHTTPHeaderField:@"Content-Type"]; // // [requestM addValue:[NSString stringWithFormat:@"%lu", (unsigned long)[data length]] forHTTPHeaderField:@"Content-Length"]; // // // request body // requestM.HTTPBody = data; // // // // NSURLSession *urlSession = [self standSession]; // // if (urlSession.delegate) { // if ([urlSession.delegate isKindOfClass:[RANetworkTaskDelegate class]]) { // // RANetworkTaskDelegate *delegate = (RANetworkTaskDelegate *)urlSession.delegate; // // if (p) { // delegate.p = p; // } // // if (r) { // delegate.r = r; // } // // if (decrypt) { // delegate.decryptHandler = decrypt; // } // // } // } // // NSURLSessionDataTask *dataTask = [urlSession uploadTaskWithRequest:requestM fromData:data]; // // [dataTask resume]; // // return dataTask; } + (NSURLSession *)standSession { NSURLSession *session = nil; RANetworkTaskDelegate *delegate = [RANetworkTaskDelegate sharedInstance]; NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration]; config.timeoutIntervalForRequest = JSON_TIMEOUT; NSOperationQueue *queue = [[NSOperationQueue alloc] init]; session = [NSURLSession sessionWithConfiguration:config delegate:delegate delegateQueue:queue]; return session; } + (NSURLSessionDownloadTask *)downloadFileOffset:(NSUInteger)offset Param:(NSDictionary *)param from:(NSString *)url method:(NSString *)method toPath:(NSString *)path progressHandler:(progressHandler)progressHandler completionHandler:(resultHandler)result { NSURLSession *sessoin = [self standSession]; RANetworkTaskDelegate *delegate = (RANetworkTaskDelegate *)sessoin.delegate; delegate.downloadTask = YES; delegate.fileCachePath = path; if (progressHandler) { delegate.p = progressHandler; } if (result) { delegate.r = result; } NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]]; req.HTTPMethod = method; if (offset > 0) { [req addValue:[NSString stringWithFormat:@"bytes=%ld-",(unsigned long)offset] forHTTPHeaderField:@"Range"]; } // 拼接参数 if (param && param.allValues.count > 0) { __block NSMutableArray *paramArr = [NSMutableArray array]; [param enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) { [paramArr addObject:[NSString stringWithFormat:@"%@=%@",key,obj]]; }]; NSString *paramStr = [paramArr componentsJoinedByString:@"&"]; req.HTTPBody = [paramStr dataUsingEncoding:NSUTF8StringEncoding]; } NSURLSessionDownloadTask *downloadTask = [sessoin downloadTaskWithRequest:req]; [downloadTask resume]; return downloadTask; } #pragma mark new interface +(NSMutableDictionary*) prepare_additional_params:(NSMutableDictionary* ) params { // // NSString *userAction = [params valueForKey:kAction]; // NSMutableDictionary *extra = [[params valueForKey:kExtra] mutableCopy]; // if ([userAction isEqualToString:@"Login"]) { // if (!extra) { // extra = [NSMutableDictionary dictionary]; // } // [extra setObject:[params objectForKey:@"user"] forKey:@"user"]; // } return params; } +(void)request_interface : (NSString*) url parameters:(NSMutableDictionary *) params err_record_url:(NSString* )recorder_url completionHandler:(resultHandler)result retry:(int) retry { // __block int retry = 0; DebugLog(url); if(![NetworkUtils IsNetworkAvailable]) { dispatch_async(dispatch_get_main_queue(), ^{ if(result) result([[RAConvertor string2dict:[NSString stringWithFormat:@"{\"result\":%d,\"err_msg\":\"%@\"}",RESULT_NET_NOTAVAILABLE,NSLocalizedString(@"net_not_available", nil)]] mutableCopy]); }); // return detailContent; return ; } params = [self prepare_additional_params:params]; //repeat: // { // return [self fake_json:url]; // AppDelegate *appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate]; //分界线的标识符 NSString *TWITTERFON_FORM_BOUNDARY = @"AaB03x"; //根据url初始化request NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url] cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:JSON_TIMEOUT]; //分界线 --AaB03x NSString *MPboundary=[[NSString alloc]initWithFormat:@"--%@",TWITTERFON_FORM_BOUNDARY]; //结束符 AaB03x-- NSString *endMPboundary=[[NSString alloc]initWithFormat:@"%@--",MPboundary]; //要上传的图片 // UIImage *image=[params objectForKey:@"pic"]; //得到图片的data /* // NSData* data = [NSData dataWithContentsOfFile:file_path]; */ //http body的字符串 NSMutableString *body=[[NSMutableString alloc]init]; // NSMutableDictionary* params = [[NSMutableDictionary alloc] init]; // [params setValue:@"handset_login" forKey:@"action"]; // [headers setValue:[NSString stringWithFormat:@"%d",dataLength] forKey:@"Content-Length"]; // [params setValue:appDelegate.sessionid forKey:@"sessionid"]; // [params setValue:password forKey:@"password"]; // [params setValue:[NSString stringWithFormat:@"%d",ver] forKey:@"auth_ver"]; // [headers setValue:headQuerlString forKey:@"param"]; //参数的集合的所有key的集合 NSArray *keys= [params allKeys]; DebugLog(@"================parms=================="); //遍历keys for(int i=0;i<[keys count];i++) { //得到当前key NSString *key=[keys objectAtIndex:i]; //如果key不是pic,说明value是字符类型,比如name:Boris if(![key isEqualToString:@"pic"]) { //添加分界线,换行 [body appendFormat:@"%@\r\n",MPboundary]; //添加字段名称,换2行 [body appendFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n",key]; //添加字段的值 [body appendFormat:@"%@\r\n",[params objectForKey:key]]; DebugLog(@"parameter: key=%@ value=%@",key,[params objectForKey:key]); } } DebugLog(@"================parms=================="); ////添加分界线,换行 /* [body appendFormat:@"%@\r\n",MPboundary]; //声明pic字段,文件名为boris.png NSString * file_format=[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"upfile\"; filename=\"%@\"\r\n", [file_path lastPathComponent]]; [body appendFormat:@"%@", file_format]; //声明上传文件的格式 [body appendFormat:@"Content-Type: application/zip\r\n\r\n"]; */ //声明结束符:--AaB03x-- NSString *end=[[NSString alloc]initWithFormat:@"%@",endMPboundary]; //声明myRequestData,用来放入http body NSMutableData *myRequestData=[NSMutableData data]; //将body字符串转化为UTF8格式的二进制 [myRequestData appendData:[body dataUsingEncoding:NSUTF8StringEncoding]]; /* //将image的data加入 [myRequestData appendData:data]; */ //加入结束符--AaB03x-- [myRequestData appendData:[end dataUsingEncoding:NSUTF8StringEncoding]]; //设置HTTPHeader中Content-Type的值 NSString *content=[[NSString alloc]initWithFormat:@"multipart/form-data; boundary=%@",TWITTERFON_FORM_BOUNDARY]; //设置HTTPHeader [request setValue:content forHTTPHeaderField:@"Content-Type"]; [request setValue:@"multipart/form-data" forHTTPHeaderField:@"enctype"]; // 关闭keep alive [request setValue:@"close" forHTTPHeaderField:@"Connection"]; //设置Content-Length [request setValue:[NSString stringWithFormat:@"%lu", (unsigned long)[myRequestData length]] forHTTPHeaderField:@"Content-Length"]; //设置http body [request setHTTPBody:myRequestData]; //http method [request setHTTPMethod:@"POST"]; // NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]]; // // request.HTTPMethod = @"POST"; // // // // 拼接参数 // if (params && params.allValues.count > 0) { // __block NSMutableArray *paramArr = [NSMutableArray array]; // // DebugLog(@"================PARAMS BEGIN=================="); // [params enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) { // [paramArr addObject:[NSString stringWithFormat:@"%@=%@",key,obj]]; // DebugLog(@"parameter: key=%@ value=%@",key,obj); // }]; // // DebugLog(@"================PARAMS END=================="); // NSString *paramStr = [paramArr componentsJoinedByString:@"&"]; // paramStr =[paramStr stringByAppendingString:@"&"]; //// DebugLog(@"http body %@",paramStr); // NSData* requestdata =[paramStr dataUsingEncoding:NSUTF8StringEncoding]; // request.HTTPBody = requestdata; // [request setValue:[NSString stringWithFormat:@"%lu", (unsigned long)[requestdata length]] forHTTPHeaderField:@"Content-Length"]; // } NSURLSession *urlSession = [self standSession]; if (urlSession.delegate) { if ([urlSession.delegate isKindOfClass:[RANetworkTaskDelegate class]]) { RANetworkTaskDelegate *delegate = (RANetworkTaskDelegate *)urlSession.delegate; // if (p) { // delegate.p = p; // } // if (result) { delegate.r = result; } // // if (decrypt) { // delegate.decryptHandler = decrypt; // } } } NSURLSessionDataTask *dataTask =[urlSession dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { NSData *responseData =data; NSLog(@"request_interface response"); DebugLog(@"request_interface result length:%ld", data.length); NSHTTPURLResponse* urlResponse =(NSHTTPURLResponse*)response; if (responseData==nil) { DebugLog(@"request_interface error:%@", [error localizedDescription]); NSMutableDictionary* ret = [[NSMutableDictionary alloc] init]; //#define RESULT_FALSE 0 //#define RESULT_TRUE 2 //#define RESULT_NET_ERROR -3 //#define RESULT_NET_NOTAVAILABLE -4 //#define RESULT_ERROR -5 //#define RESULT_LOCALFILE_ERROR -7 //#define RESULT_USERAUTH_ERROR -9 //#define RESULT_UPDATE_USERAUTH_ERROR -11 //#define RESULT_SESSION_EXPIRED -13 //#define RESULT_VER_LOW // NSString * moreinfo = error.description ; NSString* err_msg = [error localizedDescription]; //-----------------retry 3 times for error code -1005------------------------ if(error.code==-1005&&retry<3) { int new_retry=retry+1; dispatch_async(dispatch_get_main_queue(), ^{ [self request_interface:url parameters:params err_record_url:recorder_url completionHandler:result retry:new_retry]; return; }); // retry++; // goto repeat; } //-----------------end retry 3 times for error code -1005------------------------ NSDictionary* error_json = [RAUtils error_dict:error]; [ret setObject:error_json forKey:@"err_obj"]; NSString* resp_msg= nil; if(err_msg.length==0) { err_msg =[NSHTTPURLResponse localizedStringForStatusCode:urlResponse.statusCode]; resp_msg = err_msg; } [ret setValue:[NSString stringWithFormat:@"%d",RESULT_NET_ERROR] forKey:@"result"]; [ret setValue:err_msg forKey:@"err_msg"]; [ret setValue:resp_msg forKey:@"resp_msg"]; [ret setValue:[NSString stringWithFormat:@"%ld",(long)urlResponse.statusCode] forKey:@"resp_code"]; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:ret options:0 error:nil]; if(![url isEqualToString:recorder_url]) { [self err_log:[RAUtils base64en:[RAConvertor dict2string:params]] result:[RAUtils base64en:[RAConvertor dict2string:ret]] module:url code:RESULT_NET_ERROR]; } dispatch_async(dispatch_get_main_queue(), ^{ if(result) return result([[RAConvertor data2dict:jsonData] mutableCopy]); }); } else { NSString *str = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; DebugLog(@"request_interface result:%@", str); NSMutableDictionary* dict =[[RAConvertor data2dict:responseData] mutableCopy]; if([dict[@"result"] intValue]==RESULT_USERAUTH_ERROR) { dict[@"err_msg"]=@"Authorization failed."; } // 兼容不同后台的错误消息反馈 if([dict[@"result"] intValue]!=RESULT_TRUE&&dict[@"msg"]!=nil && dict[@"err_msg"]==nil) { dict[@"err_msg"]=dict[@"msg"]; } if([dict[@"result"] intValue]!=RESULT_TRUE&&dict[@"message"]!=nil && dict[@"err_msg"]==nil) { dict[@"err_msg"]=dict[@"message"]; } // if([dict[@"result"] intValue]==RESULT_ERROR) // { //// RESULT_ERROR // } if(dict==nil) { dict= [NSMutableDictionary new]; dict[@"result"]=@9; dict[@"err_msg"]=@"Sorry, can not access server, please contact support."; } dispatch_async(dispatch_get_main_queue(), ^{ if(result) return result(dict); }); } }]; // NSURLSessionDataTask *dataTask = [urlSession dataTaskWithRequest:request ]; [dataTask resume]; return ; } +(void)request_file_fast : (NSString*) url parameters:(NSMutableDictionary *) params completionHandler:(resultHandler)result // Param:(NSDictionary *)param from:(NSString *)url completionHandler:(resultHandler)result /* dataHandler:(dataHandler)returndata*/ { if(![NetworkUtils IsNetworkAvailable]) { dispatch_async(dispatch_get_main_queue(), ^{ if(result) result([[RAConvertor string2dict:[NSString stringWithFormat:@"{\"result\":%d,\"err_msg\":\"%@\"}",RESULT_NET_NOTAVAILABLE,NSLocalizedString(@"net_not_available", nil)]] mutableCopy]); }); // return detailContent; return ; } params = [self prepare_additional_params:params]; NSURLSession *urlSession = [self standSession]; // RANetworkTaskDelegate *delegate = (RANetworkTaskDelegate *)urlSession.delegate; // delegate.downloadTask = YES; // delegate.fileCachePath = path; // if (progressHandler) { // delegate.p = progressHandler; // } // // if (result) { // delegate.r = result; // } NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]]; request.HTTPMethod = @"Post"; // // if (offset > 0) { // [request addValue:[NSString stringWithFormat:@"bytes=%ld-",(unsigned long)offset] forHTTPHeaderField:@"Range"]; // } // 拼接参数 if (params && params.allValues.count > 0) { __block NSMutableArray *paramArr = [NSMutableArray array]; [params enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) { [paramArr addObject:[NSString stringWithFormat:@"%@=%@",key,obj]]; }]; NSString *paramStr = [paramArr componentsJoinedByString:@"&"]; request.HTTPBody = [paramStr dataUsingEncoding:NSUTF8StringEncoding]; } NSURLSessionDownloadTask* downloadTask=[urlSession downloadTaskWithRequest:request completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) { NSHTTPURLResponse* urlResponse =(NSHTTPURLResponse*)response; NSData* data =[NSData dataWithContentsOfURL:location] ; NSMutableDictionary* ret = [[NSMutableDictionary alloc] init]; if(data==nil) { NSString* err_msg = [error localizedDescription]; NSDictionary* error_json = [RAUtils error_dict:error]; [ret setObject:error_json forKey:@"err_obj"]; NSString* resp_msg= nil; if(err_msg.length==0) { err_msg =[NSHTTPURLResponse localizedStringForStatusCode:urlResponse.statusCode]; resp_msg = err_msg; } [ret setValue:[NSString stringWithFormat:@"%d",RESULT_NET_ERROR] forKey:@"result"]; [ret setValue:err_msg forKey:@"err_msg"]; [ret setValue:resp_msg forKey:@"resp_msg"]; [ret setValue:[NSString stringWithFormat:@"%ld",(long)urlResponse.statusCode] forKey:@"resp_code"]; dispatch_async(dispatch_get_main_queue(), ^{ if(result) result(ret); }); } else { NSString* path=NSTemporaryDirectory(); if (response.suggestedFilename) { path = [path stringByAppendingPathComponent:response.suggestedFilename]; } else { path = [path stringByAppendingPathComponent:[NSUUID UUID].UUIDString]; } NSError *error = nil; if([[NSFileManager defaultManager] fileExistsAtPath:path]) { [[NSFileManager defaultManager] removeItemAtPath:path error:nil]; } [[NSFileManager defaultManager] copyItemAtPath:location.path toPath:path error:&error]; // [[NSFileManager defaultManager] copyItemAtURL:[NSURL URLWithString:location.path] toURL:[NSURL URLWithString:path] error:&error]; // NSFileManager // NSString *cacheDir = NSTemporaryDirectory(); // // if (![[NSFileManager defaultManager] fileExistsAtPath:cacheDir]) { // [[NSFileManager defaultManager] createDirectoryAtPath:cacheDir withIntermediateDirectories:NO attributes:nil error:nil]; // } ret[@"suggestedFilename"]=response.suggestedFilename; ret[@"result"]=@"2"; ret[@"data"]=data; ret[@"path"]=path;//[location absoluteString]; dispatch_async(dispatch_get_main_queue(), ^{ if(result) result(ret); }); } // if(returndata) // { // returndata(data); // } }]; [downloadTask resume]; return ; } +(void)request_upload_fast :(NSData *)filedata FileName:(NSString*) filename server:(NSString*) urlString parameters:(NSMutableDictionary *) params completionHandler:(resultHandler)result { // NSString *fileName = [filePath lastPathComponent]; DebugLog(urlString); NSMutableData *dataM = [NSMutableData data]; NSMutableString *stringM = [NSMutableString string]; DebugLog(@"================parms=================="); for (NSString *key in params) { [stringM appendString:[NSString stringWithFormat:@"--%@\r\n",BOUNDARY]]; [stringM appendFormat:@"Content-Type: text/plain; charset=UTF-8\r\n"]; [stringM appendFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n",key]; [stringM appendFormat:@"%@\r\n",[params objectForKey:key]]; DebugLog(@"parameter: key=%@ value=%@",key,[params objectForKey:key]); } DebugLog(@"================parms=================="); // Apex Drivers 2018.5.5 if (filedata) { [stringM appendString:[NSString stringWithFormat:@"--%@\r\n",BOUNDARY]]; [stringM appendFormat:@"Content-Disposition: form-data; name=\"upfile\"; filename=%@\r\n",filename]; [stringM appendString:@"Content-Type: application/mac-binary\r\n"]; [stringM appendString:@"\r\n"]; NSData *stringM_data = [stringM dataUsingEncoding:NSUTF8StringEncoding]; [dataM appendData:stringM_data]; // NSData *file_data = [NSData dataWithContentsOfFile:filePath]; [dataM appendData:filedata]; NSString *end = [NSString stringWithFormat:@"\r\n--%@--",BOUNDARY]; [dataM appendData:[end dataUsingEncoding:NSUTF8StringEncoding]]; } else { NSData *stringM_data = [stringM dataUsingEncoding:NSUTF8StringEncoding]; [dataM appendData:stringM_data]; NSString *end = [NSString stringWithFormat:@"\r\n--%@--",BOUNDARY]; [dataM appendData:[end dataUsingEncoding:NSUTF8StringEncoding]]; } // Data NSData *data = dataM; // 可变请求 NSURL *url = [NSURL URLWithString:urlString]; NSMutableURLRequest *requestM = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:JSON_TIMEOUT]; // line note requestM.HTTPMethod = @"POST"; // request header [requestM addValue:@"close" forHTTPHeaderField:@"Connection"]; [requestM addValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@",BOUNDARY] forHTTPHeaderField:@"Content-Type"]; [requestM addValue:@"multipart/form-data" forHTTPHeaderField:@"enctype"]; [requestM addValue:[NSString stringWithFormat:@"%lu", (unsigned long)[data length]] forHTTPHeaderField:@"Content-Length"]; // request body requestM.HTTPBody = data; NSURLSession *urlSession = [self standSession]; // if (urlSession.delegate) { // if ([urlSession.delegate isKindOfClass:[RANetworkTaskDelegate class]]) { // // RANetworkTaskDelegate *delegate = (RANetworkTaskDelegate *)urlSession.delegate; // // if (p) { // delegate.p = p; // } // // if (r) { // delegate.r = r; // } // // if (decrypt) { // delegate.decryptHandler = decrypt; // } // // } // } // NSURLSessionDataTask *dataTask = [urlSession uploadTaskWithRequest:requestM fromData:data]; // [urlSession uploadTaskWithRequest:<#(nonnull NSURLRequest *)#> fromData:<#(nullable NSData *)#> completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { // <#code#> // }]; // [urlSession uploadTaskWithRequest:<#(nonnull NSURLRequest *)#> fromFile:<#(nonnull NSURL *)#> completionHandler:<#^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error)completionHandler#>] NSURLSessionUploadTask *uploadTask = [urlSession uploadTaskWithRequest:requestM fromData:data completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { NSData *responseData =data; NSHTTPURLResponse* urlResponse =(NSHTTPURLResponse*)response; if (responseData==nil) { DebugLog(@"request_upload_fast error:%@", [error localizedDescription]); NSMutableDictionary* ret = [[NSMutableDictionary alloc] init]; //#define RESULT_FALSE 0 //#define RESULT_TRUE 2 //#define RESULT_NET_ERROR -3 //#define RESULT_NET_NOTAVAILABLE -4 //#define RESULT_ERROR -5 //#define RESULT_LOCALFILE_ERROR -7 //#define RESULT_USERAUTH_ERROR -9 //#define RESULT_UPDATE_USERAUTH_ERROR -11 //#define RESULT_SESSION_EXPIRED -13 //#define RESULT_VER_LOW // NSString * moreinfo = error.description ; NSString* err_msg = [error localizedDescription]; // //-----------------retry 3 times for error code -1005------------------------ // if(error.code==-1005&&retry<3) // { // int new_retry=retry+1; // [self request_interface:url parameters:params err_record_url:recorder_url completionHandler:result retry:new_retry]; // return; // // retry++; // // goto repeat; // // } //-----------------end retry 3 times for error code -1005------------------------ NSDictionary* error_json = [RAUtils error_dict:error]; [ret setObject:error_json forKey:@"err_obj"]; NSString* resp_msg= nil; if(err_msg.length==0) { err_msg =[NSHTTPURLResponse localizedStringForStatusCode:urlResponse.statusCode]; resp_msg = err_msg; } [ret setValue:[NSString stringWithFormat:@"%d",RESULT_NET_ERROR] forKey:@"result"]; [ret setValue:err_msg forKey:@"err_msg"]; [ret setValue:resp_msg forKey:@"resp_msg"]; [ret setValue:[NSString stringWithFormat:@"%ld",(long)urlResponse.statusCode] forKey:@"resp_code"]; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:ret options:0 error:nil]; // if(![urlString isEqualToString:recorder_url]) // { // [self err_log:[RAUtils base64en:[RAConvertor dict2string:params]] result:[RAUtils base64en:[RAConvertor dict2string:ret]] module:url code:RESULT_NET_ERROR]; // } dispatch_async(dispatch_get_main_queue(), ^{ if(result) return result([[RAConvertor data2dict:jsonData] mutableCopy]); }); } else { NSString *str = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; DebugLog(@"request_upload_fast result:%@", str); NSMutableDictionary* dict =[[RAConvertor data2dict:responseData] mutableCopy]; if([dict[@"result"] intValue]==RESULT_USERAUTH_ERROR) { dict[@"err_msg"]=@"Authorization failed."; } // 兼容不同后台的错误消息反馈 if([dict[@"result"] intValue]!=RESULT_TRUE&&dict[@"msg"]!=nil && dict[@"err_msg"]==nil) { dict[@"err_msg"]=dict[@"msg"]; } if([dict[@"result"] intValue]!=RESULT_TRUE&&dict[@"message"]!=nil && dict[@"err_msg"]==nil) { dict[@"err_msg"]=dict[@"message"]; } if(dict==nil) { dict= [NSMutableDictionary new]; dict[@"result"]=@9; dict[@"err_msg"]=@"Sorry, can not access server, please contact support."; } // if([dict[@"result"] intValue]==RESULT_ERROR) // { //// RESULT_ERROR // } dispatch_async(dispatch_get_main_queue(), ^{ if(result) return result(dict); }); } }]; [uploadTask resume]; } @end