NSURLSession的网络请求类
2015-11-25 15:33
447 查看
ios9以后弃用NSURLConnection的方法,用NSURLSession封装网络请求:
根据返回类型建三个方法去请求
前两个需要回调,需要在h文件声明回调类型
在m文件完成方法:
代理方法
根据返回类型建三个方法去请求
//对于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;
前两个需要回调,需要在h文件声明回调类型
void (^finishCallbackBlock)(NSDictionary *resultDic,NSString *errorString); // 执行完成后回调的block void (^finishHtmlCallbackBlock)(NSString *resultHtmlString,NSString *errorString);
在m文件完成方法:
+ (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); } } }
相关文章推荐
- 常用工具类(日志、Toast、SPUtils、单位转换类、 DensityUtils、SDCardUtils、ScreenU、App相关辅助类、KeyBoardUtils、NetUtils、Http)
- tcp 中 sys攻击记录
- 【Python网络爬虫】百度贴吧/豆瓣小组
- linux https代理squid搭建
- TCP/IP的协议栈和帧格式
- 数据包校验记录——IP校验&FCS校验
- Https与SSL介绍
- u-boot2011网络驱动模型
- Android网络编程六:(2)Universal-Image-Loader之缓存策略
- 减少HTTP请求之将图片转成二进制并生成Base64编码,可以在网页中通过url查看图片(大型网站优化技术)
- 用iperf测试Hi3531(1000兆)的网络性能
- CentOS 配置cobbler通过网络安装Linux系统
- 忘掉旋转,利用2-3-4树,学习红黑树 http://www.cnblogs.com/liuyunfeng/archive/2013/12/12/3471368.html
- charles中如何对https抓包
- Java Socket发送与接收HTTP消息简单实现
- httpclient绕过登陆验证码抓取数据
- 5、EIGRP DUAL网络收敛算法
- HP-SOCKET很好用的网络底层引擎
- 重温httpsession①
- Android网络编程六:(1)Universal-Image-Loader