对ASIHTTPRequest的封装

.h文件 

[html]  view plain copy
  1. //  
  2. //  HttpUtil.h  
  3. //  SmallTaurus  
  4. //  
  5. //  Created by Fuer on 14-7-7.  
  6. //  Copyright (c) 2014年 FuEr. All rights reserved.  
  7. //  
  8. /**  
  9.  *  对ASI的封装  
  10.  */  
  11. #import <Foundation/Foundation.h>  
  12. #import "ASIHTTPRequest.h"  
  13. #import "ASIFormDataRequest.h"  
  14. /**  
  15.  *  Debug_LOG信息控制;  
  16.  *  
  17.  *  IS_ENABLE_DEBUG_LOG 设置为 1 ,打印请求log基本信息;  
  18.  *  IS_ENABLE_DEBUG_LOG 设置为 0 ,不打印请求log基本信息;  
  19.  */  
  20. #define IS_ENABLE_DEBUG_LOG 1  
  21.   
  22. #if IS_ENABLE_DEBUG_LOG  
  23. #define kDEBUG_LOG() NSLog(@"line:(%d),%s",__LINE__,__FUNCTION__)  
  24. #define kNSLog(...)  NSLog(__VA_ARGS__)  
  25. #else  
  26. #define kDEBUG_LOG()  
  27. #define kNSLog(...)  
  28. #endif  
  29.   
  30. extern NSString *const kAPI_BASE_URL;  
  31.   
  32. /**  
  33.  *  ASICLient 请求回调的块声明;  
  34.  *  
  35.  *  基本的请求完成,失败,上传及下载进度 Block回调;  
  36.  */  
  37. typedef void (^KKCompletedBlock)(id JSON,NSString *stringData);  
  38. typedef void (^KKFailedBlock)(NSError *error);  
  39. typedef void (^KKProgressBlock)(float progress);  
  40.   
  41.   
  42. @interface HttpUtil : NSObject  
  43. +(HttpUtil*)shareInstance;  
  44. /**  
  45.  *  一般的get请求,无参数;  
  46.  *  
  47.  *  @param path          接口路径,不能为空;  
  48.  *  @param completeBlock 请求完成块,返回 id JSON, NSString *stringData;  
  49.  *  @param failed        请求失败块,返回 NSError *error;  
  50.  *  
  51.  *  @return 返回ASIHTTPRequest的指针,可用于 NSOperationQueue操作;  
  52.  */  
  53. + (ASIHTTPRequest *)GET_Path:(NSString *)path completed:(KKCompletedBlock )completeBlock failed:(KKFailedBlock )failed;  
  54.   
  55. /**  
  56.  *  一般的GET请求,有参数;  
  57.  *  
  58.  *  @param path          接口路径,不能为空;  
  59.  *  @param paramsDic     请求的参数的字典,参数可为nil, 例如:NSDictionary *params = @{@"key":@"value"}  
  60.  *  @param completeBlock 请求完成块,返回 id JSON, NSString *stringData;  
  61.  *  @param failed        请求失败块,返回 NSError *error;  
  62.  *  
  63.  *  @return 返回ASIHTTPRequest的指针,可用于 NSOperationQueue操作  
  64.  */  
  65. + (ASIHTTPRequest *)GET_Path:(NSString *)path params:(NSDictionary *)paramsDic completed:(KKCompletedBlock )completeBlock failed:(KKFailedBlock )failed;  
  66.   
  67. /**  
  68.  *  一般的POST请求,有参数;  
  69.  *  
  70.  *  @param path          接口路径,不能为空;  
  71.  *  @param paramsDic     请求的参数的字典,参数可为nil, 例如:NSDictionary *params = @{@"key":@"value"}  
  72.  *  @param completeBlock 请求完成块,返回 id JSON, NSString *stringData;  
  73.  *  @param failed        请求失败块,返回 NSError *error;  
  74.  *  
  75.  *  @return 返回ASIHTTPRequest的指针,可用于 NSOperationQueue操作  
  76.  */  
  77. + (ASIHTTPRequest *)POST_Path:(NSString *)path params:(NSDictionary *)paramsDic completed:(KKCompletedBlock )completeBlock failed:(KKFailedBlock )failed;  
  78.   
  79. /**  
  80.  *  一般GET请求下载文件;  
  81.  *  
  82.  *  @param path           接口路径,不能为空;  
  83.  *  @param destination    下载文件保存的路径,不能为空;  
  84.  *  @param name           下载文件保存的名字,不能为空;  
  85.  *  @param progressBlock  下载文件的Progress块,返回 float progress,在此跟踪下载进度;  
  86.  *  @param completeBlock  请求完成块,无返回值;  
  87.  *  @param failed         请求失败块,返回 NSError *error;  
  88.  *  
  89.  *  @return 返回ASIHTTPRequest的指针,可用于 NSOperationQueue操作  
  90.  */  
  91. + (ASIHTTPRequest *)DownFile_Path:(NSString *)path writeTo:(NSString *)destination fileName:(NSString *)name setProgress:(KKProgressBlock)progressBlock completed:(ASIBasicBlock)completedBlock failed:(KKFailedBlock )failed;  
  92.   
  93.   
  94. /**  
  95.  *  一般的POST上传文件;  
  96.  *  
  97.  *  @param path           上传接口路径,不能为空;  
  98.  *  @param filePath       要上传的文件路径,不能为空;  
  99.  *  @param fileKey        上传文件对应服务器接收的key,不能为空;  
  100.  *  @param params         请求的参数的字典,参数可为nil, 例如:NSDictionary *params = @{@"key":@"value"}  
  101.  *  @param progressBlock  上传文件的Progress块,返回 float progress,在此跟踪下载进度;  
  102.  *  @param completeBlock  请求完成块,返回 id JSON, NSString *stringData;  
  103.  *  @param failed         请求失败块,返回 NSError *error;  
  104.  *  
  105.  *  @return 返回ASIHTTPRequest的指针,可用于 NSOperationQueue操作  
  106.  */  
  107. + (ASIHTTPRequest *)UploadFile_Path:(NSString *)path file:(NSString *)filePath forKey:(NSString *)fileKey params:(NSDictionary *)params SetProgress:(KKProgressBlock )progressBlock completed:(KKCompletedBlock )completedBlock failed:(KKFailedBlock )failed;  
  108.   
  109.   
  110. /**  
  111.  *  一般的POST数据Data上传;  
  112.  *  
  113.  *  @param path           上传接口路径,不能为空;  
  114.  *  @param fData          要上传的文件Data,不能为空;  
  115.  *  @param dataKey        上传的Data对应服务器接收的key,不能为空;  
  116.  *  @param params         请求的参数的字典,参数可为nil, 例如:NSDictionary *params = @{@"key":@"value"}  
  117.  *  @param progressBlock  上传文件的Progress块,返回 float progress,在此跟踪下载进度;  
  118.  *  @param completeBlock  请求完成块,返回 id JSON, NSString *stringData;  
  119.  *  @param failed         请求失败块,返回 NSError *error;  
  120.  *  
  121.  *  @return 返回ASIHTTPRequest的指针,可用于 NSOperationQueue操作  
  122.  */  
  123. + (ASIHTTPRequest *)UploadData_Path:(NSString *)path fileData:(NSData *)fData forKey:(NSString *)dataKey params:(NSDictionary *)params SetProgress:(KKProgressBlock )progressBlock completed:(KKCompletedBlock )completedBlock failed:(KKFailedBlock )failed;  
  124.   
  125.   
  126. /**  
  127.  *  文件下载,支持断点续传功能;  
  128.  *  
  129.  *  @param path            接口路径,不能为空;  
  130.  *  @param destinationPath 下载文件要保存的路径,不能为空;  
  131.  *  @param tempPath        临时文件保存的路径,不能为空;  
  132.  *  @param name            下载保存的文件名,不能为空;  
  133.  *  @param progressBlock   下载文件的Progress块,返回 float progress,在此跟踪下载进度;  
  134.  *  @param completedBlock  下载完成回调块,无回返值;  
  135.  *  @param failed          下载失败回调块,返回 NSError *error;  
  136.  *  
  137.  *  @return 返回ASIHTTPRequest的指针,可用于 NSOperationQueue操作  
  138.  */  
  139. + (ASIHTTPRequest *)ResumeDown_Path:(NSString *)path writeTo:(NSString *)destinationPath tempPath:(NSString *)tempPath fileName:(NSString *)name setProgress:(KKProgressBlock )progressBlock completed:(ASIBasicBlock )completedBlock failed:(KKFailedBlock )failed;  
  140.   
  141.   
  142. /*  
  143.  安装:配置  
  144.  1:所需frame.work;  
  145.  CFNetwork, SystemConfiguration, MobileCoreServices, CoreGraphics and libz.dylib  libxml2.dylib  
  146.  2: ASI Tests 需要 https://github.com/gh-unit/gh-unit/tree/master 然后导入 :GHUnitIOS.framework  
  147.  3:bulid setting  Header search path 添加 /usr/include/libxml2  
  148.  4:在 test/ASIDataCompareTest.m中有个 NStask错误,删除文件即可;  
  149.  5: 如果使用 Test文件加里面的东西,使用 GHUnitIOS.framework http://stackoverflow.com/questions/13925437/ghunitios-ghunit-h-file-not-found-in-xcode  
  150.    
  151.  官方文档:http://allseeing-i.com/ASIHTTPRequest/How-to-use  
  152.    
  153.  */  
  154. @end  

.m文件

[html]  view plain copy
  1. //  
  2. //  HttpUtil.m  
  3. //  SmallTaurus  
  4. //  
  5. //  Created by Fuer on 14-7-7.  
  6. //  Copyright (c) 2014年 FuEr. All rights reserved.  
  7. //  
  8.   
  9. #import "HttpUtil.h"  
  10. NSString *const kAPI_BASE_URL = @"http://api.douban.com/v2/";  
  11.   
  12. @implementation HttpUtil  
  13. +(HttpUtil*)shareInstance  
  14. {  
  15.     static HttpUtil *httpUtil = nil;  
  16.     static dispatch_once_t onceToken;  
  17.     dispatch_once(&onceToken, ^{  
  18.         httpUtil = [[HttpUtil alloc]init];  
  19.     });  
  20.     return httpUtil;  
  21. }  
  22. + (ASIHTTPRequest *)GET_Path:(NSString *)path completed:(KKCompletedBlock )completeBlock failed:(KKFailedBlock )failed  
  23. {  
  24.     NSString *urlStr = [NSString stringWithFormat:@"%@%@",kAPI_BASE_URL,path];  
  25.     urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];  
  26.     NSURL *url = [NSURL URLWithString:urlStr];  
  27.     __weak ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];  
  28.     request.requestMethod = @"GET";  
  29.       
  30.     [request setCompletionBlock:^{  
  31.         NSError *errorForJSON = [NSError errorWithDomain:@"请求数据解析为json格式,发出错误" code:2014 userInfo:@{@"请求数据json解析错误": @"中文",@"serial the data to json error":@"English"}];  
  32.         id jsonData = [NSJSONSerialization JSONObjectWithData:[request responseData] options:0 error:&errorForJSON];  
  33.         completeBlock(jsonData,request.responseString);  
  34.     }];  
  35.       
  36.     [request setFailedBlock:^{  
  37.         failed([request error]);  
  38.     }];  
  39.       
  40.     [request startAsynchronous];  
  41.       
  42.     kNSLog(@"ASIClient GET: %@",[request url]);  
  43.       
  44.     return request;  
  45. }  
  46.   
  47. + (ASIHTTPRequest *)GET_Path:(NSString *)path params:(NSDictionary *)paramsDic completed:(KKCompletedBlock )completeBlock failed:(KKFailedBlock )failed  
  48. {  
  49.     NSMutableString *paramsString = [NSMutableString stringWithCapacity:1];  
  50.     [paramsDic enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {  
  51.         [paramsString appendFormat:@"%@=%@",key,obj];  
  52.         [paramsString appendString:@"&"];  
  53.     }];  
  54.     NSString *urlStr = [NSString stringWithFormat:@"%@%@?%@",kAPI_BASE_URL,path,paramsString];  
  55.     urlStr = [urlStr substringToIndex:urlStr.length-1];  
  56.     urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];  
  57.       
  58.     NSURL *url = [NSURL URLWithString:urlStr];  
  59.     __weak ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];  
  60.     request.requestMethod = @"GET";  
  61.       
  62.     [request setCompletionBlock:^{  
  63.         NSError *errorForJSON = [NSError errorWithDomain:@"请求数据解析为json格式,发出错误" code:2014 userInfo:@{@"请求数据json解析错误": @"中文",@"serial the data to json error":@"English"}];  
  64.         id jsonData = [NSJSONSerialization JSONObjectWithData:[request responseData] options:0 error:&errorForJSON];  
  65.         completeBlock(jsonData,request.responseString);  
  66.     }];  
  67.       
  68.     [request setFailedBlock:^{  
  69.         failed([request error]);  
  70.     }];  
  71.       
  72.     [request startAsynchronous];  
  73.       
  74.     kNSLog(@"ASIClient GET: %@",[request url]);  
  75.       
  76.     return request;  
  77. }  
  78.   
  79.   
  80. + (ASIHTTPRequest *)POST_Path:(NSString *)path params:(NSDictionary *)paramsDic completed:(KKCompletedBlock )completeBlock failed:(KKFailedBlock )failed  
  81. {  
  82.     NSString *urlStr = [NSString stringWithFormat:@"%@%@",kAPI_BASE_URL,path];  
  83.     urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];  
  84.     NSURL *url = [NSURL URLWithString:urlStr];  
  85.     __weak ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];  
  86.     request.requestMethod = @"POST";  
  87.       
  88.     [paramsDic enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {  
  89.         [request setPostValue:obj forKey:key];  
  90.     }];  
  91.       
  92.     [request setCompletionBlock:^{  
  93.         NSError *errorForJSON = [NSError errorWithDomain:@"请求数据解析为json格式,发出错误" code:2014 userInfo:@{@"请求数据json解析错误": @"中文",@"serial the data to json error":@"English"}];  
  94.         id jsonData = [NSJSONSerialization JSONObjectWithData:[request responseData] options:0 error:&errorForJSON];  
  95.         completeBlock(jsonData,request.responseString);  
  96.     }];  
  97.       
  98.     [request setFailedBlock:^{  
  99.         failed([request error]);  
  100.     }];  
  101.       
  102.     [request startAsynchronous];  
  103.       
  104.     kNSLog(@"ASIClient POST: %@ %@",[request url],paramsDic);  
  105.       
  106.     return request;  
  107. }  
  108.   
  109.   
  110. + (ASIHTTPRequest *)DownFile_Path:(NSString *)path writeTo:(NSString *)destination fileName:(NSString *)name setProgress:(KKProgressBlock)progressBlock completed:(ASIBasicBlock)completedBlock failed:(KKFailedBlock )failed  
  111. {  
  112.     __weak ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:path]];  
  113.     NSString *filePath = nil;  
  114.     if ([destination hasSuffix:@"/"]) {  
  115.         filePath = [NSString stringWithFormat:@"%@%@",destination,name];  
  116.     }  
  117.     else  
  118.     {  
  119.         filePath = [NSString stringWithFormat:@"%@/%@",destination,name];  
  120.     }  
  121.     [request setDownloadDestinationPath:filePath];  
  122.       
  123.     __block float downProgress = 0;  
  124.     [request setBytesReceivedBlock:^(unsigned long long size, unsigned long long total) {  
  125.         downProgress += (float)size/total;  
  126.         progressBlock(downProgress);  
  127.     }];  
  128.       
  129.     [request setCompletionBlock:^{  
  130.         downProgress = 0;  
  131.         completedBlock();  
  132.     }];  
  133.       
  134.     [request setFailedBlock:^{  
  135.         failed([request error]);  
  136.     }];  
  137.       
  138.     [request startAsynchronous];  
  139.       
  140.     kNSLog(@"ASIClient 下载文件:%@ ",path);  
  141.     kNSLog(@"ASIClient 保存路径:%@",filePath);  
  142.       
  143.     return request;  
  144. }  
  145.   
  146.   
  147. + (ASIHTTPRequest *)UploadFile_Path:(NSString *)path file:(NSString *)filePath forKey:(NSString *)fileKey params:(NSDictionary *)params SetProgress:(KKProgressBlock )progressBlock completed:(KKCompletedBlock )completedBlock failed:(KKFailedBlock )failed  
  148. {  
  149.       
  150.     NSURL *url = [NSURL URLWithString:path];  
  151.     __weak ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];  
  152.     [request setFile:filePath forKey:fileKey];  
  153.     if (params.count > 0) {  
  154.         [params enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {  
  155.             [request setPostValue:obj forKey:key];  
  156.         }];  
  157.     }  
  158.       
  159.     __block float upProgress = 0;  
  160.     [request setBytesSentBlock:^(unsigned long long size, unsigned long long total) {  
  161.         upProgress += (float)size/total;  
  162.         progressBlock(upProgress);  
  163.     }];  
  164.       
  165.     [request setCompletionBlock:^{  
  166.         upProgress=0;  
  167.         NSError *errorForJSON = [NSError errorWithDomain:@"请求数据解析为json格式,发出错误" code:2014 userInfo:@{@"请求数据json解析错误": @"中文",@"serial the data to json error":@"English"}];  
  168.         id jsonData = [NSJSONSerialization JSONObjectWithData:[request responseData] options:0 error:&errorForJSON];  
  169.         completedBlock(jsonData,[request responseString]);  
  170.     }];  
  171.       
  172.     [request setFailedBlock:^{  
  173.         failed([request error]);  
  174.     }];  
  175.       
  176.     [request startAsynchronous];  
  177.       
  178.     kNSLog(@"ASIClient 文件上传:%@ file=%@ key=%@",path,filePath,fileKey);  
  179.     kNSLog(@"ASIClient 文件上传参数:%@",params);  
  180.       
  181.     return request;  
  182. }  
  183.   
  184.   
  185. + (ASIHTTPRequest *)UploadData_Path:(NSString *)path fileData:(NSData *)fData forKey:(NSString *)dataKey params:(NSDictionary *)params SetProgress:(KKProgressBlock )progressBlock completed:(KKCompletedBlock )completedBlock failed:(KKFailedBlock )failed  
  186. {  
  187.     NSURL *url = [NSURL URLWithString:path];  
  188.     __weak ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];  
  189.     [request setData:fData forKey:dataKey];  
  190.     if (params.count > 0) {  
  191.         [params enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {  
  192.             [request setPostValue:obj forKey:key];  
  193.         }];  
  194.     }  
  195.       
  196.     __block float upProgress = 0;  
  197.     [request setBytesSentBlock:^(unsigned long long size, unsigned long long total) {  
  198.         upProgress += (float)size/total;  
  199.         progressBlock(upProgress);  
  200.     }];  
  201.       
  202.     [request setCompletionBlock:^{  
  203.         upProgress=0;  
  204.         NSError *errorForJSON = [NSError errorWithDomain:@"请求数据解析为json格式,发出错误" code:2014 userInfo:@{@"请求数据json解析错误": @"中文",@"serial the data to json error":@"English"}];  
  205.         id jsonData = [NSJSONSerialization JSONObjectWithData:[request responseData] options:0 error:&errorForJSON];  
  206.         completedBlock(jsonData,[request responseString]);  
  207.     }];  
  208.       
  209.     [request setFailedBlock:^{  
  210.         failed([request error]);  
  211.     }];  
  212.       
  213.     [request startAsynchronous];  
  214.       
  215.     kNSLog(@"ASIClient 文件上传:%@ size=%.2f MB  key=%@",path,fData.length/1024.0/1024.0,dataKey);  
  216.     kNSLog(@"ASIClient 文件上传参数:%@",params);  
  217.       
  218.     return request;  
  219. }  
  220.   
  221.   
  222. + (ASIHTTPRequest *)ResumeDown_Path:(NSString *)path writeTo:(NSString *)destinationPath tempPath:(NSString *)tempPath fileName:(NSString *)name setProgress:(KKProgressBlock )progressBlock completed:(ASIBasicBlock )completedBlock failed:(KKFailedBlock )failed  
  223. {  
  224.     __weak ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:path]];  
  225.     NSString *filePath = nil;  
  226.     if ([destinationPath hasSuffix:@"/"]) {  
  227.         filePath = [NSString stringWithFormat:@"%@%@",destinationPath,name];  
  228.     }  
  229.     else  
  230.     {  
  231.         filePath = [NSString stringWithFormat:@"%@/%@",destinationPath,name];  
  232.     }  
  233.       
  234.     [request setDownloadDestinationPath:filePath];  
  235.       
  236.     NSString *tempForDownPath = nil;  
  237.     if ([tempPath hasSuffix:@"/"]) {  
  238.         tempForDownPath = [NSString stringWithFormat:@"%@%@.download",tempPath,name];  
  239.     }  
  240.     else  
  241.     {  
  242.         tempForDownPath = [NSString stringWithFormat:@"%@/%@.download",tempPath,name];  
  243.     }  
  244.       
  245.     [request setTemporaryFileDownloadPath:tempForDownPath];  
  246.     [request setAllowResumeForFileDownloads:YES];  
  247.       
  248.     __block float downProgress = 0;  
  249.     downProgress = [[NSUserDefaults standardUserDefaults] floatForKey:@"ASIClient_ResumeDOWN_PROGRESS"];  
  250.     [request setBytesReceivedBlock:^(unsigned long long size, unsigned long long total) {  
  251.         downProgress += (float)size/total;  
  252.         if (downProgress >1.0) {  
  253.             downProgress=1.0;  
  254.         }  
  255.         [[NSUserDefaults standardUserDefaults] setFloat:downProgress forKey:@"ASIClient_ResumeDOWN_PROGRESS"];  
  256.         progressBlock(downProgress);  
  257.     }];  
  258.       
  259.     [request setCompletionBlock:^{  
  260.         downProgress = 0;  
  261.         [[NSUserDefaults standardUserDefaults] setFloat:downProgress forKey:@"ASIClient_ResumeDOWN_PROGRESS"];  
  262.         completedBlock();  
  263.         if ([[NSFileManager defaultManager] fileExistsAtPath:tempForDownPath]) {  
  264.             //NSError *errorForDelete = [NSError errorWithDomain:@"删除临时文件发生错误!" code:2015 userInfo:@{@"删除临时文件发生错误": @"中文",@"delete the temp fife error":@"English"}];  
  265.             //[[NSFileManager defaultManager] removeItemAtPath:tempForDownPath error:&errorForDelete];  
  266.             kNSLog(@"l  %d> %s",__LINE__,__func__);  
  267.         }  
  268.     }];  
  269.       
  270.     [request setFailedBlock:^{  
  271.         failed([request error]);  
  272.     }];  
  273.       
  274.     [request startAsynchronous];  
  275.       
  276.     kNSLog(@"ASIClient 下载文件:%@ ",path);  
  277.     kNSLog(@"ASIClient 保存路径:%@",filePath);  
  278.     if (downProgress >0 && downProgress) {  
  279.         if (downProgress >=1.0) downProgress = 0.9999;  
  280.         kNSLog(@"ASIClient 上次下载已完成:%.2f/100",downProgress*100);  
  281.     }  
  282.     return request;  
  283. }  
  284. @end  


在使用这个时候,注意NSJSONSerialization的options参数。

你可能感兴趣的:(对ASIHTTPRequest的封装)