ios9以后弃用NSURLConnection的方法,用NSURLSession封装网络请求:
根据返回类型建三个方法去请求
改进demohttps://blog.youkuaiyun.com/gwh111/article/details/79700933
//对于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);
}
}
}