// // RemoteRequest.m // codeChallengeDemo // // Created by Scar on 14-8-21. // Copyright (c) 2014年 scar1900. All rights reserved. // #import "RemoteRequest.h" #import "ASIHTTPRequest/ASIFormDataRequest.h" #import "ASIHTTPRequest/Reachability.h" #import #import "Util.h" @implementation Remote(Request) + (void)doJsonAction:(int)actionTag requestUrl:(NSString*)requestUrl parameter:(NSDictionary*)parameter delegate:(id)delegate { [[Remote instance] doJsonAction:actionTag requestUrl:requestUrl parameter:parameter delegate:delegate]; } + (void)doJsonActionWithBlock:(int)actionTag requestUrl:(NSString*)requestUrl parameter:(NSDictionary*)parameter withWaitCursor:(BOOL)isHaveCursor completion:(void(^)(BOOL success,NSString *message,id responseData))completion { [[Remote instance] doJsonActionWithBlock:actionTag requestUrl:requestUrl parameter:parameter withWaitCursor:isHaveCursor completion:completion]; } + (void)doSimpleAction:(int)actionTag requestUrl:(NSString*)requestUrl { [[Remote instance]doSimpleAction:actionTag requestUrl:requestUrl]; } + (void)doNoneJsonActionWithBlock:(int)actionTag requestUrl:(NSString*)requestUrl parameter:(NSDictionary*)parameter withWaitCursor:(BOOL)isHaveCursor completion:(void(^)(BOOL success,NSString *message,id responseData))completion { [[Remote instance]doNoneJsonActionWithBlock:actionTag requestUrl:requestUrl parameter:parameter withWaitCursor:isHaveCursor completion:completion]; } + (void)downloadFileAsync:(NSString*)requestUrl actionTag:(int)actionTag filePath:(NSString*)filePath delegate:(id)delegate { [[Remote instance] downloadFileAsync:requestUrl actionTag:actionTag filePath:filePath delegate:delegate]; } + (void)downloadFileAsyncWithBlock:(NSString*)requestUrl actionTag:(int)actionTag filePath:(NSString*)filePath completion:(void(^)(BOOL success,NSString *message,id responseData))completion { [[Remote instance] downloadFileAsyncWithBlock:requestUrl actionTag:actionTag filePath:filePath completion:completion]; } + (void)downloadOfflineFileAsyncASI:(NSString*)requestUrl actionTag:(int)actionTag parameter:(NSDictionary*)parameter fileName:(NSString*)fileName delegate:(id)delegate { [[Remote instance] downloadOfflineFileAsyncASI:requestUrl actionTag:actionTag parameter:(NSDictionary*)parameter fileName:(NSString*)fileName delegate:delegate]; } + (void)downloadOfflineFileAsyncURLSession:(NSString*)requestUrl actionTag:(int)actionTag parameter:(NSDictionary*)parameter fileName:(NSString*)fileName delegate:(id)delegate { [[Remote instance] downloadOfflineFileAsyncURLSession:requestUrl actionTag:actionTag parameter:(NSDictionary*)parameter fileName:(NSString*)fileName delegate:delegate]; } + (void)upLoadImageAsyncWithBlock:(NSString*)requestUrl actionTag:(int)actionTag parameter:(NSDictionary*)parameter image:(NSString*)fileName completion:(void(^)(BOOL success,NSString *message,id responseData))completion{ [[Remote instance] upLoadImageAsyncWithBlock:requestUrl actionTag:actionTag parameter:parameter image:fileName completion:completion]; } + (void)doXmlRequestWithBlock:(NSString*)requestUrl completion:(void(^)(BOOL success,NSString *message,id responseData))completion{ [[Remote instance] doXmlRequestWithBlock:requestUrl completion:completion]; } - (void)doSimpleAction:(int)actionTag requestUrl:(NSString*)requestUrl { @try { NSURL *URL = nil; URL = [NSURL URLWithString:requestUrl];; if (![requestUrl hasPrefix:@"http://"]) { NSLog(@"url有错误,请检查!"); return; } TPLOG(@"----JSON------ServerUrl=%@", URL.absoluteString); // 组织报文头 ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:URL]; [request setDelegate:self]; if (![self connectedToNetwork]) { [self performSelector:@selector(onError:userInfo:) withObject:noNetworkMessage withObject:[request userInfo]]; [self performSelector:@selector(stopWaitCursor:) withObject:request.userInfo]; return; } [request startAsynchronous]; } @catch (NSException * e) { TPLOG(@"-------NSException = %@----", e.reason); } } - (void)doJsonAction:(int)actionTag requestUrl:(NSString*)requestUrl parameter:(NSDictionary*)parameter delegate:(id)delegate { NSMutableDictionary* userInfo = [NSMutableDictionary dictionary]; if (nil != delegate) { [userInfo setObject:delegate forKey:@"delegate"]; } [userInfo setObject:@(actionTag) forKey:@"actionTag"]; @try { [self performSelector:@selector(startWaitCursor:) withObject:userInfo]; NSURL *URL = nil; if (![requestUrl hasPrefix:@"http://"]) { requestUrl = [RemoteURL stringByAppendingString:requestUrl]; URL = [NSURL URLWithString:requestUrl]; }else { URL = [NSURL URLWithString:requestUrl];; } if (![requestUrl hasPrefix:@"http://"]) { NSLog(@"url有错误,请检查!"); return; } TPLOG(@"----JSON------ServerUrl=%@", URL.absoluteString); TPLOG(@"parameters:%@",parameter); // 组织报文头 ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:URL]; if (parameter) { [parameter.allKeys enumerateObjectsUsingBlock:^(NSString *key, NSUInteger idx, BOOL *stop) { if (parameter[key]) { [request setPostValue:parameter[key] forKey:key]; } }]; }else { NSMutableData *data = [NSMutableData data]; [request setPostBody:data]; } [request setUserInfo:userInfo]; [self setHeaderOfRequest:request]; [request setDidFinishSelector:@selector(jsonFinished:)]; [request setDelegate:self]; if ([delegate respondsToSelector:@selector(stopRemoteRequestWhenPop)]&& [delegate respondsToSelector:@selector(setRequest:)]) { [delegate performSelector:@selector(setRequest:) withObject:request]; } // Reachability *r = [Reachability reachabilityWithHostName:@"www.baidu.com"]; // NetworkStatus netStatus = [r currentReachabilityStatus]; if (![self connectedToNetwork]) { [self performSelector:@selector(onError:userInfo:) withObject:noNetworkMessage withObject:[request userInfo]]; [self performSelector:@selector(stopWaitCursor:) withObject:request.userInfo]; return; } [request startAsynchronous]; } @catch (NSException * e) { TPLOG(@"-------NSException = %@----", e.reason); } } - (void)doJsonActionWithBlock:(int)actionTag requestUrl:(NSString*)requestUrl parameter:(NSDictionary*)parameter withWaitCursor:(BOOL)isHaveCursor completion:(void(^)(BOOL success,NSString *message,id responseData))completion { NSMutableDictionary* userInfo = [NSMutableDictionary dictionary]; [userInfo setObject:@(actionTag) forKey:@"actionTag"]; [userInfo setObject:completion forKey:@"completeHandler"]; @try { if (isHaveCursor) { [self performSelector:@selector(startWaitCursor:) withObject:userInfo]; } NSURL *URL = nil; if (![requestUrl hasPrefix:@"http://"]) { requestUrl = [RemoteURL stringByAppendingString:requestUrl]; URL = [NSURL URLWithString:requestUrl]; }else { URL = [NSURL URLWithString:requestUrl]; } if (![requestUrl hasPrefix:@"http://"]) { NSLog(@"url有错误,请检查!"); return; } TPLOG(@"----JSON------ServerUrl=%@", URL.absoluteString); TPLOG(@"parameters:%@",parameter); // 组织报文头 ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:URL]; if (parameter) { [parameter.allKeys enumerateObjectsUsingBlock:^(NSString *key, NSUInteger idx, BOOL *stop) { if (parameter[key]) { [request setPostValue:parameter[key] forKey:key]; } }]; }else { NSMutableData *data = [NSMutableData data]; [request setPostBody:data]; } [request setUserInfo:userInfo]; [self setHeaderOfRequest:request]; [request setDidFinishSelector:@selector(jsonFinishedWithBlock:)]; [request setDelegate:self]; // Reachability *r = [Reachability reachabilityWithHostName:@"www.baidu.com"]; // NetworkStatus netStatus = [r currentReachabilityStatus]; if (![self connectedToNetwork]) { [self performSelector:@selector(onError:userInfo:) withObject:noNetworkMessage withObject:[request userInfo]]; [self performSelector:@selector(stopWaitCursor:) withObject:request.userInfo]; return; } [request startAsynchronous]; } @catch (NSException * e) { TPLOG(@"-------NSException = %@----", e.reason); } } - (void)doNoneJsonActionWithBlock:(int)actionTag requestUrl:(NSString*)requestUrl parameter:(NSDictionary*)parameter withWaitCursor:(BOOL)isHaveCursor completion:(void(^)(BOOL success,NSString *message,id responseData))completion { NSMutableDictionary* userInfo = [NSMutableDictionary dictionary]; [userInfo setObject:@(actionTag) forKey:@"actionTag"]; [userInfo setObject:completion forKey:@"completeHandler"]; @try { if (isHaveCursor) { [self performSelector:@selector(startWaitCursor:) withObject:userInfo]; } NSURL *URL = nil; if (![requestUrl hasPrefix:@"http://"]) { requestUrl = [RemoteURL stringByAppendingString:requestUrl]; URL = [NSURL URLWithString:requestUrl]; }else { URL = [NSURL URLWithString:requestUrl]; } if (![requestUrl hasPrefix:@"http://"]) { NSLog(@"url有错误,请检查!"); return; } TPLOG(@"----JSON------ServerUrl=%@", URL.absoluteString); TPLOG(@"parameters:%@",parameter); // 组织报文头 ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:URL]; if (parameter) { [parameter.allKeys enumerateObjectsUsingBlock:^(NSString *key, NSUInteger idx, BOOL *stop) { if (parameter[key]) { [request setPostValue:parameter[key] forKey:key]; } }]; }else { NSMutableData *data = [NSMutableData data]; [request setPostBody:data]; } [request setUserInfo:userInfo]; [self setHeaderOfRequest:request]; [request setDidFinishSelector:@selector(noneJsonFinishedWithBlock:)]; [request setDelegate:self]; // Reachability *r = [Reachability reachabilityWithHostName:@"www.baidu.com"]; // NetworkStatus netStatus = [r currentReachabilityStatus]; if (![self connectedToNetwork]) { [self performSelector:@selector(onError:userInfo:) withObject:noNetworkMessage withObject:[request userInfo]]; [self performSelector:@selector(stopWaitCursor:) withObject:request.userInfo]; return; } [request startAsynchronous]; } @catch (NSException * e) { TPLOG(@"-------NSException = %@----", e.reason); } } - (void)setHeaderOfRequest:(ASIHTTPRequest*)request { [request setRequestMethod:@"POST"]; [request addRequestHeader:@"Content-Type" value:@"application/json; encoding=utf-8"]; [request addRequestHeader:@"Accept" value:@"application/json"]; [request addRequestHeader:@"WD-UUID" value:[TPUserDefault instance].uuid]; [request addRequestHeader:@"WD-RESOLUTION" value:[TPUserDefault instance].deviceResolution]; [request addRequestHeader:@"WD-CHANNEL" value:@"App Store"]; if (isPad) { [request addRequestHeader:@"WD-CLIENT-TYPE" value:@"01"]; }else { [request addRequestHeader:@"WD-CLIENT-TYPE" value:@"03"]; } [request addRequestHeader:@"WD-SYSTEM" value:[TPUserDefault instance].systemInfo]; [request addRequestHeader:@"WD-VERSION" value:[TPUserDefault instance].appVersion]; if ([TPUserDefault instance].deviceUA && !isBlankString([TPUserDefault instance].deviceUA)) { [request addRequestHeader:@"WD-UA" value:[TPUserDefault instance].deviceUA]; } if ([TPUserDefault instance].userBO) { [request addRequestHeader:@"userId" value:[(NSNumber*)[TPUserDefault instance].userBO.userId stringValue]]; [request addRequestHeader:@"WD-TOKEN" value:[TPUserDefault instance].userBO.token]; } } - (void)downloadFileAsync:(NSString*)requestUrl actionTag:(int)actionTag filePath:(NSString*)filePath delegate:(id)delegate { NSMutableDictionary* userInfo = [NSMutableDictionary dictionary]; [userInfo setObject:delegate forKey:@"delegate"]; [userInfo setObject:filePath forKey:@"fileName"]; [userInfo setObject:[NSNumber numberWithInt:actionTag] forKey:@"actionTag"]; @try { //开始等待光标 [self performSelector:@selector(startWaitCursor:) withObject:userInfo]; NSURL *URL = nil; if ([requestUrl hasPrefix:@"http://"]) { URL = [NSURL URLWithString:requestUrl]; }else { TPLOG(@"所给下载链接有错误!"); return; } ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:URL]; // 组织报文头 [request setRequestMethod:@"GET"]; [request setUserInfo:userInfo]; [request setDelegate:self]; [request setDidFinishSelector:@selector(DownloadFinish:)]; [request setDownloadDestinationPath:filePath]; if ([delegate respondsToSelector:@selector(stopRemoteRequestWhenPop)]&& [delegate respondsToSelector:@selector(setRequest:)]) { [delegate performSelector:@selector(setRequest:) withObject:request]; } [request startAsynchronous]; } @catch (NSException * e) { TPLOG(@"-------NSException = %@----", e.reason); } } - (void)downloadFileAsyncWithBlock:(NSString*)requestUrl actionTag:(int)actionTag filePath:(NSString*)filePath completion:(void(^)(BOOL success,NSString *message,id responseData))completion { NSMutableDictionary* userInfo = [NSMutableDictionary dictionary]; [userInfo setObject:filePath forKey:@"fileName"]; [userInfo setObject:[NSNumber numberWithInt:actionTag] forKey:@"actionTag"]; @try { // //开始等待光标 // [self performSelector:@selector(startWaitCursor:) withObject:userInfo]; self.downloadFinishHanlder = completion; NSURL *URL = nil; if ([requestUrl hasPrefix:@"http://"]) { URL = [NSURL URLWithString:requestUrl]; }else { TPLOG(@"所给下载链接有错误!"); return; } ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:URL]; // 组织报文头 [request setRequestMethod:@"GET"]; [request setUserInfo:userInfo]; [request setDelegate:self]; [request setDidFinishSelector:@selector(DownloadFinishWithBlock:)]; [request setDownloadDestinationPath:filePath]; [request startAsynchronous]; } @catch (NSException * e) { TPLOG(@"-------NSException = %@----", e.reason); } } - (void)downloadOfflineFileAsyncASI:(NSString*)requestUrl actionTag:(int)actionTag parameter:(NSDictionary*)parameter fileName:(NSString*)fileName delegate:(id)delegate { NSMutableDictionary* userInfo = [NSMutableDictionary dictionary]; [userInfo setObject:delegate forKey:@"delegate"]; [userInfo setObject:fileName forKey:@"fileName"]; [userInfo setObject:[NSNumber numberWithInt:actionTag] forKey:@"actionTag"]; @try { if (ExistAtPath(ConfigPath(fileName))) { [self performSelector:@selector(onError:userInfo:) withObject:@"已存在该文件" withObject:userInfo]; return; } NSURL *URL = nil; if (![requestUrl hasPrefix:@"http://"]) { requestUrl = [RemoteURL stringByAppendingString:requestUrl]; URL = [NSURL URLWithString:requestUrl]; }else { URL = [NSURL URLWithString:requestUrl];; } if (![requestUrl hasPrefix:@"http://"]) { NSLog(@"url有错误,请检查!"); return; } if (![self connectedToNetwork]) { [self performSelector:@selector(onError:userInfo:) withObject:noNetworkMessage withObject:userInfo]; [self performSelector:@selector(stopWaitCursor:) withObject:userInfo]; return; } ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:URL]; [request setShouldContinueWhenAppEntersBackground:YES]; [request setDownloadDestinationPath:ConfigPath(fileName)]; TPLOG(@"downloadPath:%@",ConfigPath(fileName)); [request setTemporaryFileDownloadPath:tempPath(fileName)]; [request setAllowResumeForFileDownloads:YES]; [request setDelegate:self]; [request setDownloadProgressDelegate:self]; [request setRequestMethod:@"GET"]; [request setUserInfo:userInfo]; [request setDidFinishSelector:@selector(offlineDownloadFinished:)]; if ([delegate respondsToSelector:@selector(setRequest:)]) { [delegate performSelector:@selector(setRequest:) withObject:request]; } [self.remoteQueue addOperation:request]; } @catch (NSException *exception) { TPLOG(@"-------NSException = %@----", exception.reason); } } - (void)downloadOfflineFileAsyncURLSession:(NSString*)requestUrl actionTag:(int)actionTag parameter:(NSDictionary*)parameter fileName:(NSString*)fileName delegate:(id)delegate { NSMutableDictionary* userInfo = [NSMutableDictionary dictionary]; [userInfo setObject:delegate forKey:@"delegate"]; [userInfo setObject:fileName forKey:@"fileName"]; [userInfo setObject:[NSNumber numberWithInt:actionTag] forKey:@"actionTag"]; @try { if (ExistAtPath(ConfigPath(fileName))) { [self performSelector:@selector(onError:userInfo:) withObject:@"已存在该文件" withObject:userInfo]; return; } NSURL *URL = nil; if (![requestUrl hasPrefix:@"http://"]) { requestUrl = [RemoteURL stringByAppendingString:requestUrl]; URL = [NSURL URLWithString:requestUrl]; }else { URL = [NSURL URLWithString:requestUrl];; } if (![requestUrl hasPrefix:@"http://"]) { NSLog(@"url有错误,请检查!"); return; } if (![self connectedToNetwork]) { [self performSelector:@selector(onError:userInfo:) withObject:noNetworkMessage withObject:userInfo]; [self performSelector:@selector(stopWaitCursor:) withObject:userInfo]; return; } NSURLRequest *request = [NSURLRequest requestWithURL:URL]; // NSURLSessionDownloadTask *task = [[Remote session] downloadTaskWithRequest:request completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) { // [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO]; // TPLOG(@"Download success for URL: %@",location.description); // // }]; NSURLSessionDownloadTask *task = [[Remote session] downloadTaskWithRequest:request]; [userInfo setValue:task forKey:@"task"]; //将请求信息加入缓存 if (self.sessionTaskList.count > 0) { __block BOOL isHave = NO; __block NSURLSessionDownloadTask* resumeTask = nil; [self.sessionTaskList enumerateObjectsUsingBlock:^(NSMutableDictionary* obj, NSUInteger idx, BOOL *stop) { if ([obj[@"actionTag"] intValue] == actionTag) { if (obj[@"partialData"]) { resumeTask = [[Remote session] downloadTaskWithResumeData:obj[@"partialData"]]; [obj setValue:resumeTask forKey:@"task"]; }else { [obj setValue:task forKey:@"task"]; } isHave = YES; } }]; if (!isHave) { [self.sessionTaskList addObject:userInfo]; [task resume]; }else { if (resumeTask) { [resumeTask resume]; }else { [task resume]; } } }else { NSMutableDictionary *dic = [TPUserDefault instance].pauseDataDic; NSString *actionTagStr = [NSString stringWithFormat:@"%d",actionTag]; if (dic[actionTagStr]) { [self.sessionTaskList addObject:userInfo]; NSURLSessionDownloadTask *resumeTask = [[Remote session] downloadTaskWithResumeData:dic[actionTagStr]]; [resumeTask resume]; }else { [self.sessionTaskList addObject:userInfo]; [task resume]; } } } @catch (NSException *exception) { TPLOG(@"-------NSException = %@----", exception.reason); } } - (void)upLoadImageAsyncWithBlock:(NSString*)requestUrl actionTag:(int)actionTag parameter:(NSDictionary*)parameter image:(NSString*)fileName completion:(void(^)(BOOL success,NSString *message,id responseData))completion { NSMutableDictionary* userInfo = [NSMutableDictionary dictionary]; [userInfo setObject:@(actionTag) forKey:@"actionTag"]; [userInfo setObject:completion forKey:@"completeHandler"]; @try { [self performSelector:@selector(startWaitCursor:) withObject:userInfo]; NSURL *URL = nil; if (![requestUrl hasPrefix:@"http://"]) { requestUrl = [RemoteURL stringByAppendingString:requestUrl]; URL = [NSURL URLWithString:requestUrl]; }else { URL = [NSURL URLWithString:requestUrl]; } if (![requestUrl hasPrefix:@"http://"]) { NSLog(@"url有错误,请检查!"); return; } TPLOG(@"----JSON------ServerUrl=%@", URL.absoluteString); TPLOG(@"parameters:%@",parameter); // 组织报文头 if (parameter) { __block NSString *urlStr = requestUrl; [parameter.allKeys enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { if (idx==0) { urlStr = [requestUrl stringByAppendingString:[NSString stringWithFormat:@"?%@=",obj]]; urlStr = [urlStr stringByAppendingString:parameter[obj]]; }else { urlStr = [urlStr stringByAppendingString:[NSString stringWithFormat:@"&%@=",obj]]; urlStr = [urlStr stringByAppendingString:parameter[obj]]; } }]; requestUrl = urlStr; } URL = [NSURL URLWithString:requestUrl]; ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:URL]; [self setHeaderOfRequest:request]; if (!isBlankString(fileName)) { [request appendPostDataFromFile:fileName]; } [request setUserInfo:userInfo]; [request setDidFinishSelector:@selector(imageUpLoadFinished:)]; [request setDelegate:self]; if (![self connectedToNetwork]) { [self performSelector:@selector(onError:userInfo:) withObject:noNetworkMessage withObject:[request userInfo]]; [self performSelector:@selector(stopWaitCursor:) withObject:request.userInfo]; return; } [request startAsynchronous]; } @catch (NSException * e) { TPLOG(@"-------NSException = %@----", e.reason); } } - (void)doXmlRequestWithBlock:(NSString*)requestUrl completion:(void(^)(BOOL success,NSString *message,id responseData))completion{ NSMutableDictionary* userInfo = [NSMutableDictionary dictionary]; [userInfo setObject:completion forKey:@"completeHandler"]; @try { NSURL *URL = nil; URL = [NSURL URLWithString:requestUrl]; if (![requestUrl hasPrefix:@"http://"]) { NSLog(@"url有错误,请检查!"); return; } TPLOG(@"----JSON------ServerUrl=%@", URL.absoluteString); // 组织报文头 ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:URL]; [self setHeaderOfRequest:request]; [request setUserInfo:userInfo]; [request setDidFinishSelector:@selector(xmlRequestFinished:)]; [request setDelegate:self]; if (![self connectedToNetwork]) { [self performSelector:@selector(onError:userInfo:) withObject:noNetworkMessage withObject:[request userInfo]]; [self performSelector:@selector(stopWaitCursor:) withObject:request.userInfo]; return; } [request startAsynchronous]; } @catch (NSException * e) { TPLOG(@"-------NSException = %@----", e.reason); } } @end