iOS9以后,苹果的数据请求用NSURLSession:
// // SkyHttpRequest.h // NSURLSessionDemo // // Created by skyzizhu on 16/6/7. // Copyright © 2016年 skyzizhu. All rights reserved. // #import <Foundation/Foundation.h> #import <CommonCrypto/CommonDigest.h> @class SkyHttpRequest; typedef void(^willSendRequestHandle)(); typedef void(^succeedRequestHandle)(NSMutableURLRequest *skyHttpRequest,id responseObject); typedef void(^errorRequestHandle)(NSError *error); @interface SkyHttpRequest : NSObject { NSDictionary *_fieldValue; NSString *_mimeType; } //当前请求会话 @property (nonatomic,strong)NSURLSession *session; //保存当前请求的内容 @property (nonatomic,strong)NSMutableData *responseData; //当前的请求 //@property (nonatomic,strong)NSMutableURLRequest *request; //初始化 + (id)manager; //添加头文件 -(void)addHeaderFieldWithFieldValue:(NSDictionary *)fieldValue; //设置上传附件类型 -(void)setMimeType:(NSString *)mimeType; //get请求 -(void)getRequestWithURL:(NSString *)url atParames:(NSDictionary *)parames atWillRequest:(willSendRequestHandle)willRequest atSucceedRequest:(succeedRequestHandle)succeedRequest atErrorRequest:(errorRequestHandle)errorRquest; //post请求 -(void)postRequestWithURL:(NSString *)url atParames:(NSDictionary *)parames atWillRequest:(willSendRequestHandle)willRequest atSucceedRequest:(succeedRequestHandle)succeedRequest atErrorRequest:(errorRequestHandle)errorRquest; //上传附件 -(void)postRequestWithURL:(NSString *)url atImageDatas:(NSArray *)datas atFormNames:(NSArray *)formNames atParames:(NSDictionary *)parames atWillRequest:(willSendRequestHandle)willRequest atSucceedRequest:(succeedRequestHandle)succeedRequest atErrorRequest:(errorRequestHandle)errorRquest; @end
// // SkyHttpRequest.m // NSURLSessionDemo // // Created by skyzizhu on 16/6/7. // Copyright © 2016年 skyzizhu. All rights reserved. // #import "SkyHttpRequest.h" static NSString *DefaultMimeType = @"image/png"; const double SkyBaseRequestOutTimeValue = 20.0; const double SkyExceptRequestOutTimeValue = 50.0; @implementation SkyHttpRequest + (id)manager { static dispatch_once_t onceQueue; static SkyHttpRequest *skyHttpRequest = nil; dispatch_once(&onceQueue, ^{ skyHttpRequest = [[self alloc] init]; skyHttpRequest.session = [NSURLSession sharedSession]; }); return skyHttpRequest; } -(void)addHeaderFieldWithFieldValue:(NSDictionary *)fieldValue { _fieldValue = nil; if(fieldValue != nil){ _fieldValue = [[NSDictionary alloc]initWithDictionary:fieldValue]; } } -(void)setMimeType:(NSString *)mimeType { _mimeType = nil; if(mimeType != nil){ _mimeType = [NSString stringWithString:mimeType]; }else{ _mimeType = DefaultMimeType; } } //设置当前request的头部信息 -(void)setFieldValueWithRequest:(NSMutableURLRequest *)request { if(_fieldValue != nil){ for (NSString *fieldKey in _fieldValue) { [request setValue:_fieldValue[fieldKey] forHTTPHeaderField:fieldKey]; } _fieldValue = nil; } } //append url key and value -(NSMutableString *)getURLOperateWithURL:(NSString *)url atParams:(NSDictionary *)params { NSMutableString *string = [NSMutableString stringWithFormat:@"%@?",url]; for (NSString *key in params) { [string appendFormat:@"%@=%@&",key,params[key]]; } [string deleteCharactersInRange:NSMakeRange([string length] - 1, 1)]; return string; } -(NSData *)postDataWithParams:(NSDictionary *)params { NSMutableString *string = [NSMutableString string]; for (NSString *key in params) { [string appendFormat:@"%@=%@&",key,params[key]]; } [string deleteCharactersInRange:NSMakeRange([string length] - 1, 1)]; return [string dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES]; } -(void)getRequestWithURL:(NSString *)url atParames:(NSDictionary *)parames atWillRequest:(willSendRequestHandle)willRequest atSucceedRequest:(succeedRequestHandle)succeedRequest atErrorRequest:(errorRequestHandle)errorRquest { if(_session != nil){ NSString *sourceUrl = (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes( kCFAllocatorDefault, (CFStringRef)url, NULL, NULL, kCFStringEncodingUTF8 )); //url init NSString *resultURL = parames == nil ? sourceUrl : [self getURLOperateWithURL:sourceUrl atParams:parames]; //request NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL:[NSURL URLWithString:resultURL] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:SkyBaseRequestOutTimeValue]; [request setHTTPMethod:@"GET"]; [self setFieldValueWithRequest:request]; // 创建任务 NSURLSessionDataTask *task = [_session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { NSHTTPURLResponse *res = (NSHTTPURLResponse *)response; if(res.statusCode == 200){ id jsonResult = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error]; succeedRequest(request,jsonResult); } if(error != nil){ errorRquest(error); } }]; // 启动任务 [task resume]; if(willRequest != nil){ willRequest(); } } } -(void)postRequestWithURL:(NSString *)url atParames:(NSDictionary *)parames atWillRequest:(willSendRequestHandle)willRequest atSucceedRequest:(succeedRequestHandle)succeedRequest atErrorRequest:(errorRequestHandle)errorRquest { if(_session != nil){ NSString *sourceUrl = (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes( kCFAllocatorDefault, (CFStringRef)url, NULL, NULL, kCFStringEncodingUTF8 )); //request NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL:[NSURL URLWithString:sourceUrl] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:SkyBaseRequestOutTimeValue]; [request setHTTPMethod:@"POST"]; [self setFieldValueWithRequest:request]; //body if(parames != nil){ [request setHTTPBody:[self postDataWithParams:parames]]; } // 创建任务 NSURLSessionDataTask *task = [_session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { NSHTTPURLResponse *res = (NSHTTPURLResponse *)response; if(res.statusCode == 200){ id jsonResult = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error]; succeedRequest(request,jsonResult); } if(error != nil){ errorRquest(error); } }]; // 启动任务 [task resume]; if(willRequest != nil){ willRequest(); } } } -(void)postRequestWithURL:(NSString *)url atImageDatas:(NSArray *)datas atFormNames:(NSArray *)formNames atParames:(NSDictionary *)parames atWillRequest:(willSendRequestHandle)willRequest atSucceedRequest:(succeedRequestHandle)succeedRequest atErrorRequest:(errorRequestHandle)errorRquest { if(_session != nil){ NSString *sourceUrl = (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes( kCFAllocatorDefault, (CFStringRef)url, NULL, NULL, kCFStringEncodingUTF8 )); //request NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL:[NSURL URLWithString:sourceUrl] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:SkyBaseRequestOutTimeValue]; [request setHTTPMethod:@"POST"]; [self setFieldValueWithRequest:request]; [self postImageDataWithCurrentRequest:request Datas:datas atImageFormNames:formNames atParams:parames]; // 创建任务 NSURLSessionDataTask *task = [_session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { NSHTTPURLResponse *res = (NSHTTPURLResponse *)response; if(res.statusCode == 200){ id jsonResult = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error]; succeedRequest(request,jsonResult); } if(error != nil){ errorRquest(error); } }]; // 启动任务 [task resume]; //will request if(willRequest != nil){ willRequest(); } } } #pragma mark - upload file event -(void)postImageDataWithCurrentRequest:(NSMutableURLRequest *)request Datas:(NSArray *)datas atImageFormNames:(NSArray *)formNames atParams:(NSDictionary *)params { NSString *TWITTERFON_FORM_BOUNDARY = @"AaB03x"; //分界线 --AaB03x NSString *MPboundary=[[NSString alloc]initWithFormat:@"--%@",TWITTERFON_FORM_BOUNDARY]; //结束符 AaB03x-- NSString *endMPboundary=[[NSString alloc]initWithFormat:@"%@--",MPboundary]; if([datas count] != [formNames count]){ return; } NSMutableString *body=[[NSMutableString alloc]init]; NSArray *keys= [params allKeys]; for(int i=0;i<[keys count];i++){ //得到当前key NSString *key=[keys objectAtIndex:i]; //添加分界线,换行 [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]]; } //声明RequestData,用来放入http body NSMutableData *RequestData=[[NSMutableData alloc]init]; //将params添加进去 [RequestData appendData:[body dataUsingEncoding:NSUTF8StringEncoding]]; for (int i = 0; i < [datas count]; i++) { // NSMutableString *subBody = [[NSMutableString alloc]init]; //fileName NSString *fileName = [NSString stringWithFormat:@"%@.png",[self sha1WithSource:[@(i) stringValue]]]; ////添加分界线,换行 [subBody appendFormat:@"%@\r\n",MPboundary]; //声明pic字段,文件名 [subBody appendFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"%@\"\r\n",formNames[i],fileName]; if(_mimeType != nil){ [subBody appendFormat:@"Content-Type: %@\r\n\r\n",_mimeType]; }else{ //声明上传文件的格式 [subBody appendFormat:@"Content-Type: %@\r\n\r\n",DefaultMimeType]; } [body appendString:subBody]; //将body字符串转化为UTF8格式的二进制 [RequestData appendData:[subBody dataUsingEncoding:NSUTF8StringEncoding]]; //将image的data加入 [RequestData appendData:datas[i]]; //必加的分隔符,每一个data后边,http的规则 [RequestData appendData:[ @"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; } //声明结束符:--AaB03x-- NSString *end=[[NSString alloc]initWithFormat:@"\r\n%@",endMPboundary]; //加入结束符--AaB03x-- [RequestData 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"]; //设置Content-Length [request setValue:[NSString stringWithFormat:@"%ld", [RequestData length]] forHTTPHeaderField:@"Content-Length"]; if([datas count] == 0 || datas == nil){ [request setHTTPBody:[body dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES]]; }else{ //设置http body [request setHTTPBody:RequestData]; } //设置类型为空 [self setMimeType:nil]; } #pragma mark - enKey by sha1 - (NSString *)sha1WithSource:(NSString *)source { NSData *data = [source dataUsingEncoding:NSUTF8StringEncoding]; uint8_t digest[CC_SHA1_DIGEST_LENGTH]; CC_SHA1(data.bytes, (int)data.length, digest); NSMutableString *output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2]; for (int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++) { [output appendFormat:@"%02x", digest[i]]; } return output; } @end