ios9以后弃用NSURLConnection的方法,用NSURLSession封装网络请求:
根据返回类型建三个方法去请求
//对于json的请求 + (void)postSessionWithJsonUrlStr:(NSString *)urlStr ParamterStr:(NSString *)paramsString FinishCallbackBlock:(void (^)(NSDictionary *, NSString *))block; //对于html的请求 + (void)postSessionWithHtmlUrlStr:(NSString *)urlStr ParamterStr:(NSString *)paramsString FinishCallbackBlock:(void (^)(NSString *, NSString *))block; //对于无需应答的请求不需要回调 + (void)postSessionWithNoReplyUrlStr:(NSString *)urlStr ParamterStr:(NSString *)paramsString;
void (^finishCallbackBlock)(NSDictionary *resultDic,NSString *errorString); // 执行完成后回调的block void (^finishHtmlCallbackBlock)(NSString *resultHtmlString,NSString *errorString);
+ (void)postSessionWithJsonUrlStr:(NSString *)urlStr ParamterStr:(NSString *)paramsString FinishCallbackBlock:(void (^)(NSDictionary *,NSString *))block{ GHttpSessionTask *executorDelegate = [[GHttpSessionTask alloc] init]; executorDelegate.finishCallbackBlock = block; // 绑定执行完成时的block NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration]; NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfig delegate:executorDelegate delegateQueue:nil]; NSURLSessionDownloadTask *mytask=[session downloadTaskWithRequest:[self postRequestWithUrlString:urlStr andParamters:paramsString]]; [mytask resume]; } + (void)postSessionWithHtmlUrlStr:(NSString *)urlStr ParamterStr:(NSString *)paramsString FinishCallbackBlock:(void (^)(NSString *, NSString *))block{ GHttpSessionTask *executorDelegate = [[GHttpSessionTask alloc] init]; executorDelegate.finishHtmlCallbackBlock = block; // 绑定执行完成时的block NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration]; NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfig delegate:executorDelegate delegateQueue:nil]; NSURLSessionDownloadTask *mytask=[session downloadTaskWithRequest:[self postRequestWithUrlString:urlStr andParamters:paramsString]]; [mytask resume]; } + (void)postSessionWithNoReplyUrlStr:(NSString *)urlStr ParamterStr:(NSString *)paramsString{ NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration]; NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfig delegate:nil delegateQueue:nil]; NSURLSessionDownloadTask *mytask=[session downloadTaskWithRequest:[self postRequestWithUrlString:urlStr andParamters:paramsString]]; [mytask resume]; } //创建request + (NSURLRequest *)postRequestWithUrlString:(NSString *)urlString andParamters:(NSString *)paramsString{ NSURL *url = [NSURL URLWithString:urlString]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; [request setHTTPMethod:@"POST"]; request.HTTPBody = [paramsString dataUsingEncoding:NSUTF8StringEncoding]; [request setTimeoutInterval:10]; //设置请求头 [request setValue:[NSString stringWithFormat:@"%@",[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"]] forHTTPHeaderField:@"appVersion"]; //[request setAllHTTPHeaderFields:nil]; NSLog(@"header=%@",[request allHTTPHeaderFields]); return request; }
#pragma mark NSURLSessionDownloadDelegate - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location{ //判断回调的数据是否为空 //判断回调的数据格式是否正确 //判断签名是否正确 if (finishCallbackBlock) { NSData *data=[NSData dataWithContentsOfURL:location]; NSString *resultString= [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"finish callback block, result json string: %@", resultString); NSDictionary *JSON = [NSJSONSerialization JSONObjectWithData: data options: NSJSONReadingMutableLeaves error: nil]; if (JSON) { finishCallbackBlock(JSON,nil); }else{ finishCallbackBlock(nil,@"服务器未响应"); } }else if(finishHtmlCallbackBlock){ NSData *data=[NSData dataWithContentsOfURL:location]; NSString *resultString= [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; if (resultString) { finishHtmlCallbackBlock(resultString,nil); } } } /* Sent periodically to notify the delegate of download progress. */ - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite{ //刷新进度条的delegate方法,同样的,获取数据,调用主线程刷新UI double currentProgress = totalBytesWritten/totalBytesExpectedToWrite; dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"currentProgress=%f",currentProgress); }); } - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes{ } //防止重复回调 只在错误时回调 - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(nullable NSError *)error{ if (finishCallbackBlock) { // 如果设置了回调的block,直接调用 if (error) { NSString *errorString=[error description]; NSLog(@"network error=%@ code=%ld",errorString,error.code); if (error.code==-1001) { errorString=@"请求超时"; } finishCallbackBlock(nil,errorString); } }else if(finishHtmlCallbackBlock){ if (error) { NSString *errorString=[error description]; NSLog(@"network error=%@ code=%ld",errorString,error.code); if (error.code==-1001) { errorString=@"请求超时"; } finishHtmlCallbackBlock(nil,errorString); } } }