.h文件
- //
- // HttpUtil.h
- // SmallTaurus
- //
- // Created by Fuer on 14-7-7.
- // Copyright (c) 2014年 FuEr. All rights reserved.
- //
- /**
- * 对ASI的封装
- */
- #import <Foundation/Foundation.h>
- #import "ASIHTTPRequest.h"
- #import "ASIFormDataRequest.h"
- /**
- * Debug_LOG信息控制;
- *
- * IS_ENABLE_DEBUG_LOG 设置为 1 ,打印请求log基本信息;
- * IS_ENABLE_DEBUG_LOG 设置为 0 ,不打印请求log基本信息;
- */
- #define IS_ENABLE_DEBUG_LOG 1
- #if IS_ENABLE_DEBUG_LOG
- #define kDEBUG_LOG() NSLog(@"line:(%d),%s",__LINE__,__FUNCTION__)
- #define kNSLog(...) NSLog(__VA_ARGS__)
- #else
- #define kDEBUG_LOG()
- #define kNSLog(...)
- #endif
- extern NSString *const kAPI_BASE_URL;
- /**
- * ASICLient 请求回调的块声明;
- *
- * 基本的请求完成,失败,上传及下载进度 Block回调;
- */
- typedef void (^KKCompletedBlock)(id JSON,NSString *stringData);
- typedef void (^KKFailedBlock)(NSError *error);
- typedef void (^KKProgressBlock)(float progress);
- @interface HttpUtil : NSObject
- +(HttpUtil*)shareInstance;
- /**
- * 一般的get请求,无参数;
- *
- * @param path 接口路径,不能为空;
- * @param completeBlock 请求完成块,返回 id JSON, NSString *stringData;
- * @param failed 请求失败块,返回 NSError *error;
- *
- * @return 返回ASIHTTPRequest的指针,可用于 NSOperationQueue操作;
- */
- + (ASIHTTPRequest *)GET_Path:(NSString *)path completed:(KKCompletedBlock )completeBlock failed:(KKFailedBlock )failed;
- /**
- * 一般的GET请求,有参数;
- *
- * @param path 接口路径,不能为空;
- * @param paramsDic 请求的参数的字典,参数可为nil, 例如:NSDictionary *params = @{@"key":@"value"}
- * @param completeBlock 请求完成块,返回 id JSON, NSString *stringData;
- * @param failed 请求失败块,返回 NSError *error;
- *
- * @return 返回ASIHTTPRequest的指针,可用于 NSOperationQueue操作
- */
- + (ASIHTTPRequest *)GET_Path:(NSString *)path params:(NSDictionary *)paramsDic completed:(KKCompletedBlock )completeBlock failed:(KKFailedBlock )failed;
- /**
- * 一般的POST请求,有参数;
- *
- * @param path 接口路径,不能为空;
- * @param paramsDic 请求的参数的字典,参数可为nil, 例如:NSDictionary *params = @{@"key":@"value"}
- * @param completeBlock 请求完成块,返回 id JSON, NSString *stringData;
- * @param failed 请求失败块,返回 NSError *error;
- *
- * @return 返回ASIHTTPRequest的指针,可用于 NSOperationQueue操作
- */
- + (ASIHTTPRequest *)POST_Path:(NSString *)path params:(NSDictionary *)paramsDic completed:(KKCompletedBlock )completeBlock failed:(KKFailedBlock )failed;
- /**
- * 一般GET请求下载文件;
- *
- * @param path 接口路径,不能为空;
- * @param destination 下载文件保存的路径,不能为空;
- * @param name 下载文件保存的名字,不能为空;
- * @param progressBlock 下载文件的Progress块,返回 float progress,在此跟踪下载进度;
- * @param completeBlock 请求完成块,无返回值;
- * @param failed 请求失败块,返回 NSError *error;
- *
- * @return 返回ASIHTTPRequest的指针,可用于 NSOperationQueue操作
- */
- + (ASIHTTPRequest *)DownFile_Path:(NSString *)path writeTo:(NSString *)destination fileName:(NSString *)name setProgress:(KKProgressBlock)progressBlock completed:(ASIBasicBlock)completedBlock failed:(KKFailedBlock )failed;
- /**
- * 一般的POST上传文件;
- *
- * @param path 上传接口路径,不能为空;
- * @param filePath 要上传的文件路径,不能为空;
- * @param fileKey 上传文件对应服务器接收的key,不能为空;
- * @param params 请求的参数的字典,参数可为nil, 例如:NSDictionary *params = @{@"key":@"value"}
- * @param progressBlock 上传文件的Progress块,返回 float progress,在此跟踪下载进度;
- * @param completeBlock 请求完成块,返回 id JSON, NSString *stringData;
- * @param failed 请求失败块,返回 NSError *error;
- *
- * @return 返回ASIHTTPRequest的指针,可用于 NSOperationQueue操作
- */
- + (ASIHTTPRequest *)UploadFile_Path:(NSString *)path file:(NSString *)filePath forKey:(NSString *)fileKey params:(NSDictionary *)params SetProgress:(KKProgressBlock )progressBlock completed:(KKCompletedBlock )completedBlock failed:(KKFailedBlock )failed;
- /**
- * 一般的POST数据Data上传;
- *
- * @param path 上传接口路径,不能为空;
- * @param fData 要上传的文件Data,不能为空;
- * @param dataKey 上传的Data对应服务器接收的key,不能为空;
- * @param params 请求的参数的字典,参数可为nil, 例如:NSDictionary *params = @{@"key":@"value"}
- * @param progressBlock 上传文件的Progress块,返回 float progress,在此跟踪下载进度;
- * @param completeBlock 请求完成块,返回 id JSON, NSString *stringData;
- * @param failed 请求失败块,返回 NSError *error;
- *
- * @return 返回ASIHTTPRequest的指针,可用于 NSOperationQueue操作
- */
- + (ASIHTTPRequest *)UploadData_Path:(NSString *)path fileData:(NSData *)fData forKey:(NSString *)dataKey params:(NSDictionary *)params SetProgress:(KKProgressBlock )progressBlock completed:(KKCompletedBlock )completedBlock failed:(KKFailedBlock )failed;
- /**
- * 文件下载,支持断点续传功能;
- *
- * @param path 接口路径,不能为空;
- * @param destinationPath 下载文件要保存的路径,不能为空;
- * @param tempPath 临时文件保存的路径,不能为空;
- * @param name 下载保存的文件名,不能为空;
- * @param progressBlock 下载文件的Progress块,返回 float progress,在此跟踪下载进度;
- * @param completedBlock 下载完成回调块,无回返值;
- * @param failed 下载失败回调块,返回 NSError *error;
- *
- * @return 返回ASIHTTPRequest的指针,可用于 NSOperationQueue操作
- */
- + (ASIHTTPRequest *)ResumeDown_Path:(NSString *)path writeTo:(NSString *)destinationPath tempPath:(NSString *)tempPath fileName:(NSString *)name setProgress:(KKProgressBlock )progressBlock completed:(ASIBasicBlock )completedBlock failed:(KKFailedBlock )failed;
- /*
- 安装:配置
- 1:所需frame.work;
- CFNetwork, SystemConfiguration, MobileCoreServices, CoreGraphics and libz.dylib libxml2.dylib
- 2: ASI Tests 需要 https://github.com/gh-unit/gh-unit/tree/master 然后导入 :GHUnitIOS.framework
- 3:bulid setting Header search path 添加 /usr/include/libxml2
- 4:在 test/ASIDataCompareTest.m中有个 NStask错误,删除文件即可;
- 5: 如果使用 Test文件加里面的东西,使用 GHUnitIOS.framework http://stackoverflow.com/questions/13925437/ghunitios-ghunit-h-file-not-found-in-xcode
- 官方文档:http://allseeing-i.com/ASIHTTPRequest/How-to-use
- */
- @end
.m文件
- //
- // HttpUtil.m
- // SmallTaurus
- //
- // Created by Fuer on 14-7-7.
- // Copyright (c) 2014年 FuEr. All rights reserved.
- //
- #import "HttpUtil.h"
- NSString *const kAPI_BASE_URL = @"http://api.douban.com/v2/";
- @implementation HttpUtil
- +(HttpUtil*)shareInstance
- {
- static HttpUtil *httpUtil = nil;
- static dispatch_once_t onceToken;
- dispatch_once(&onceToken, ^{
- httpUtil = [[HttpUtil alloc]init];
- });
- return httpUtil;
- }
- + (ASIHTTPRequest *)GET_Path:(NSString *)path completed:(KKCompletedBlock )completeBlock failed:(KKFailedBlock )failed
- {
- NSString *urlStr = [NSString stringWithFormat:@"%@%@",kAPI_BASE_URL,path];
- urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
- NSURL *url = [NSURL URLWithString:urlStr];
- __weak ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
- request.requestMethod = @"GET";
- [request setCompletionBlock:^{
- NSError *errorForJSON = [NSError errorWithDomain:@"请求数据解析为json格式,发出错误" code:2014 userInfo:@{@"请求数据json解析错误": @"中文",@"serial the data to json error":@"English"}];
- id jsonData = [NSJSONSerialization JSONObjectWithData:[request responseData] options:0 error:&errorForJSON];
- completeBlock(jsonData,request.responseString);
- }];
- [request setFailedBlock:^{
- failed([request error]);
- }];
- [request startAsynchronous];
- kNSLog(@"ASIClient GET: %@",[request url]);
- return request;
- }
- + (ASIHTTPRequest *)GET_Path:(NSString *)path params:(NSDictionary *)paramsDic completed:(KKCompletedBlock )completeBlock failed:(KKFailedBlock )failed
- {
- NSMutableString *paramsString = [NSMutableString stringWithCapacity:1];
- [paramsDic enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
- [paramsString appendFormat:@"%@=%@",key,obj];
- [paramsString appendString:@"&"];
- }];
- NSString *urlStr = [NSString stringWithFormat:@"%@%@?%@",kAPI_BASE_URL,path,paramsString];
- urlStr = [urlStr substringToIndex:urlStr.length-1];
- urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
- NSURL *url = [NSURL URLWithString:urlStr];
- __weak ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
- request.requestMethod = @"GET";
- [request setCompletionBlock:^{
- NSError *errorForJSON = [NSError errorWithDomain:@"请求数据解析为json格式,发出错误" code:2014 userInfo:@{@"请求数据json解析错误": @"中文",@"serial the data to json error":@"English"}];
- id jsonData = [NSJSONSerialization JSONObjectWithData:[request responseData] options:0 error:&errorForJSON];
- completeBlock(jsonData,request.responseString);
- }];
- [request setFailedBlock:^{
- failed([request error]);
- }];
- [request startAsynchronous];
- kNSLog(@"ASIClient GET: %@",[request url]);
- return request;
- }
- + (ASIHTTPRequest *)POST_Path:(NSString *)path params:(NSDictionary *)paramsDic completed:(KKCompletedBlock )completeBlock failed:(KKFailedBlock )failed
- {
- NSString *urlStr = [NSString stringWithFormat:@"%@%@",kAPI_BASE_URL,path];
- urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
- NSURL *url = [NSURL URLWithString:urlStr];
- __weak ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
- request.requestMethod = @"POST";
- [paramsDic enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
- [request setPostValue:obj forKey:key];
- }];
- [request setCompletionBlock:^{
- NSError *errorForJSON = [NSError errorWithDomain:@"请求数据解析为json格式,发出错误" code:2014 userInfo:@{@"请求数据json解析错误": @"中文",@"serial the data to json error":@"English"}];
- id jsonData = [NSJSONSerialization JSONObjectWithData:[request responseData] options:0 error:&errorForJSON];
- completeBlock(jsonData,request.responseString);
- }];
- [request setFailedBlock:^{
- failed([request error]);
- }];
- [request startAsynchronous];
- kNSLog(@"ASIClient POST: %@ %@",[request url],paramsDic);
- return request;
- }
- + (ASIHTTPRequest *)DownFile_Path:(NSString *)path writeTo:(NSString *)destination fileName:(NSString *)name setProgress:(KKProgressBlock)progressBlock completed:(ASIBasicBlock)completedBlock failed:(KKFailedBlock )failed
- {
- __weak ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:path]];
- NSString *filePath = nil;
- if ([destination hasSuffix:@"/"]) {
- filePath = [NSString stringWithFormat:@"%@%@",destination,name];
- }
- else
- {
- filePath = [NSString stringWithFormat:@"%@/%@",destination,name];
- }
- [request setDownloadDestinationPath:filePath];
- __block float downProgress = 0;
- [request setBytesReceivedBlock:^(unsigned long long size, unsigned long long total) {
- downProgress += (float)size/total;
- progressBlock(downProgress);
- }];
- [request setCompletionBlock:^{
- downProgress = 0;
- completedBlock();
- }];
- [request setFailedBlock:^{
- failed([request error]);
- }];
- [request startAsynchronous];
- kNSLog(@"ASIClient 下载文件:%@ ",path);
- kNSLog(@"ASIClient 保存路径:%@",filePath);
- return request;
- }
- + (ASIHTTPRequest *)UploadFile_Path:(NSString *)path file:(NSString *)filePath forKey:(NSString *)fileKey params:(NSDictionary *)params SetProgress:(KKProgressBlock )progressBlock completed:(KKCompletedBlock )completedBlock failed:(KKFailedBlock )failed
- {
- NSURL *url = [NSURL URLWithString:path];
- __weak ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
- [request setFile:filePath forKey:fileKey];
- if (params.count > 0) {
- [params enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
- [request setPostValue:obj forKey:key];
- }];
- }
- __block float upProgress = 0;
- [request setBytesSentBlock:^(unsigned long long size, unsigned long long total) {
- upProgress += (float)size/total;
- progressBlock(upProgress);
- }];
- [request setCompletionBlock:^{
- upProgress=0;
- NSError *errorForJSON = [NSError errorWithDomain:@"请求数据解析为json格式,发出错误" code:2014 userInfo:@{@"请求数据json解析错误": @"中文",@"serial the data to json error":@"English"}];
- id jsonData = [NSJSONSerialization JSONObjectWithData:[request responseData] options:0 error:&errorForJSON];
- completedBlock(jsonData,[request responseString]);
- }];
- [request setFailedBlock:^{
- failed([request error]);
- }];
- [request startAsynchronous];
- kNSLog(@"ASIClient 文件上传:%@ file=%@ key=%@",path,filePath,fileKey);
- kNSLog(@"ASIClient 文件上传参数:%@",params);
- return request;
- }
- + (ASIHTTPRequest *)UploadData_Path:(NSString *)path fileData:(NSData *)fData forKey:(NSString *)dataKey params:(NSDictionary *)params SetProgress:(KKProgressBlock )progressBlock completed:(KKCompletedBlock )completedBlock failed:(KKFailedBlock )failed
- {
- NSURL *url = [NSURL URLWithString:path];
- __weak ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
- [request setData:fData forKey:dataKey];
- if (params.count > 0) {
- [params enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
- [request setPostValue:obj forKey:key];
- }];
- }
- __block float upProgress = 0;
- [request setBytesSentBlock:^(unsigned long long size, unsigned long long total) {
- upProgress += (float)size/total;
- progressBlock(upProgress);
- }];
- [request setCompletionBlock:^{
- upProgress=0;
- NSError *errorForJSON = [NSError errorWithDomain:@"请求数据解析为json格式,发出错误" code:2014 userInfo:@{@"请求数据json解析错误": @"中文",@"serial the data to json error":@"English"}];
- id jsonData = [NSJSONSerialization JSONObjectWithData:[request responseData] options:0 error:&errorForJSON];
- completedBlock(jsonData,[request responseString]);
- }];
- [request setFailedBlock:^{
- failed([request error]);
- }];
- [request startAsynchronous];
- kNSLog(@"ASIClient 文件上传:%@ size=%.2f MB key=%@",path,fData.length/1024.0/1024.0,dataKey);
- kNSLog(@"ASIClient 文件上传参数:%@",params);
- return request;
- }
- + (ASIHTTPRequest *)ResumeDown_Path:(NSString *)path writeTo:(NSString *)destinationPath tempPath:(NSString *)tempPath fileName:(NSString *)name setProgress:(KKProgressBlock )progressBlock completed:(ASIBasicBlock )completedBlock failed:(KKFailedBlock )failed
- {
- __weak ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:path]];
- NSString *filePath = nil;
- if ([destinationPath hasSuffix:@"/"]) {
- filePath = [NSString stringWithFormat:@"%@%@",destinationPath,name];
- }
- else
- {
- filePath = [NSString stringWithFormat:@"%@/%@",destinationPath,name];
- }
- [request setDownloadDestinationPath:filePath];
- NSString *tempForDownPath = nil;
- if ([tempPath hasSuffix:@"/"]) {
- tempForDownPath = [NSString stringWithFormat:@"%@%@.download",tempPath,name];
- }
- else
- {
- tempForDownPath = [NSString stringWithFormat:@"%@/%@.download",tempPath,name];
- }
- [request setTemporaryFileDownloadPath:tempForDownPath];
- [request setAllowResumeForFileDownloads:YES];
- __block float downProgress = 0;
- downProgress = [[NSUserDefaults standardUserDefaults] floatForKey:@"ASIClient_ResumeDOWN_PROGRESS"];
- [request setBytesReceivedBlock:^(unsigned long long size, unsigned long long total) {
- downProgress += (float)size/total;
- if (downProgress >1.0) {
- downProgress=1.0;
- }
- [[NSUserDefaults standardUserDefaults] setFloat:downProgress forKey:@"ASIClient_ResumeDOWN_PROGRESS"];
- progressBlock(downProgress);
- }];
- [request setCompletionBlock:^{
- downProgress = 0;
- [[NSUserDefaults standardUserDefaults] setFloat:downProgress forKey:@"ASIClient_ResumeDOWN_PROGRESS"];
- completedBlock();
- if ([[NSFileManager defaultManager] fileExistsAtPath:tempForDownPath]) {
- //NSError *errorForDelete = [NSError errorWithDomain:@"删除临时文件发生错误!" code:2015 userInfo:@{@"删除临时文件发生错误": @"中文",@"delete the temp fife error":@"English"}];
- //[[NSFileManager defaultManager] removeItemAtPath:tempForDownPath error:&errorForDelete];
- kNSLog(@"l %d> %s",__LINE__,__func__);
- }
- }];
- [request setFailedBlock:^{
- failed([request error]);
- }];
- [request startAsynchronous];
- kNSLog(@"ASIClient 下载文件:%@ ",path);
- kNSLog(@"ASIClient 保存路径:%@",filePath);
- if (downProgress >0 && downProgress) {
- if (downProgress >=1.0) downProgress = 0.9999;
- kNSLog(@"ASIClient 上次下载已完成:%.2f/100",downProgress*100);
- }
- return request;
- }
- @end
在使用这个时候,注意NSJSONSerialization的options参数。