// // XSHttpTool.m // // Created by xiaos on 14/11/10. // Copyright © 2015年 com.xsdota. All rights reserved. // #import "XSHttpTool.h" //#import "MBProgressHUD+Extend.h" @implementation XSHttpTool #pragma mark - GET + (void)GET:(NSString *)requestKey param:(NSDictionary *)param success:(successBlock)success failure:(failureBlock)failure { [self checkReachability]; NSString *URLStr = [self getURLStrByRequsetKey:requestKey]; [[XSHttpTool sharedManager] GET:URLStr parameters:param success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"%@",operation.response.URL); success(responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { failure(error); }]; } + (void)GETCache:(NSString *)requestKey param:(NSDictionary *)param success:(successBlock)success failure:(failureBlock)failure { [self checkReachability]; NSString *URLStr = [self getURLStrByRequsetKey:requestKey]; AFHTTPRequestOperationManager *mgr = [XSHttpTool sharedManager]; mgr.requestSerializer.cachePolicy = NSURLRequestReturnCacheDataElseLoad; [mgr GET:URLStr parameters:param success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"%@",operation.response.URL); success(responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { failure(error); }]; } #pragma mark - POST + (void)POST:(NSString *)requestKey param:(NSDictionary *)param success:(successBlock)success failure:(failureBlock)failure { [self checkReachability]; NSString *URLStr = [self getURLStrByRequsetKey:requestKey]; [[XSHttpTool sharedManager] POST:URLStr parameters:param success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"%@",operation.response.URL); success(responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { failure(error); }]; } + (void)UpLoadData:(NSData *)data to:(NSString *)requestKey withParamName:(NSString *)paramName fileName:(NSString *)fileName mimeType:(NSString *)type param:(NSDictionary *)param success:(successBlock)success failure:(failureBlock)failure uploadProgress:(progressBlock)uploadProgress { [self checkReachability]; NSString *URLStr = [self getURLStrByRequsetKey:requestKey]; AFHTTPRequestOperation *operation = [[XSHttpTool sharedManager] POST:URLStr parameters:param constructingBodyWithBlock:^(id formData) { [formData appendPartWithFileData:data name:paramName fileName:fileName mimeType:type]; } success:^(AFHTTPRequestOperation *operation, id responseObject) { success(responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { failure(error); }]; [operation setUploadProgressBlock:^(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) { CGFloat percent = totalBytesWritten * 1.0 / totalBytesExpectedToWrite; uploadProgress(percent); }]; } + (void)upLoadImages:(NSArray *)images to:(NSString *)requestKey withParamName:(NSString *)paramName ratio:(float)ratio param:(NSDictionary *)param success:(successBlock)success failure:(failureBlock)failure uploadProgress:(progressBlock)uploadProgress { [self checkReachability]; NSString *URLStr = [self getURLStrByRequsetKey:requestKey]; AFHTTPRequestOperation *operation = [[XSHttpTool sharedManager] POST:URLStr parameters:param constructingBodyWithBlock:^(id formData) { NSUInteger i = 0; NSDateFormatter *formatter = [[NSDateFormatter alloc]init]; [formatter setDateFormat:@"yyyyMMddHHmm"]; NSString *dateString = [formatter stringFromDate:[NSDate date]]; for (UIImage *image in images) { NSString *fileName = [NSString stringWithFormat:@"%@_%lu.png",dateString,(unsigned long)i]; NSData *imageData; if (ratio > 0.0f && ratio < 1.0f) { imageData = UIImageJPEGRepresentation(image, ratio); }else{ imageData = UIImageJPEGRepresentation(image, 1.0f); } [formData appendPartWithFileData:imageData name:paramName fileName:fileName mimeType:@"image/jpg/png/jpeg"]; } } success:^(AFHTTPRequestOperation *operation, id responseObject) { success(responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { failure(error); }]; [operation setUploadProgressBlock:^(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) { CGFloat percent = totalBytesWritten * 1.0 / totalBytesExpectedToWrite; uploadProgress(percent); }]; } #pragma mark - 设置单例 超时请求响应解析 + (AFHTTPRequestOperationManager *)sharedManager { AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; [manager.requestSerializer setTimeoutInterval:TIMEOUT]; // manager. //header 设置 // [manager.requestSerializer setValue:K_PASS_IP forHTTPHeaderField:@"Host"]; // [manager.requestSerializer setValue:@"max-age=0" forHTTPHeaderField:@"Cache-Control"]; // [manager.requestSerializer setValue:@"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" forHTTPHeaderField:@"Accept"]; // [manager.requestSerializer setValue:@"zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3" forHTTPHeaderField:@"Accept-Language"]; // [manager.requestSerializer setValue:@"gzip, deflate" forHTTPHeaderField:@"Accept-Encoding"]; // [manager.requestSerializer setValue:@"keep-alive" forHTTPHeaderField:@"Connection"]; // [manager.requestSerializer setValue:@"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:35.0) Gecko/20100101 Firefox/35.0" forHTTPHeaderField:@"User-Agent"]; manager.requestSerializer.cachePolicy = 0; manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/plain", @"text/html", @"application/json", nil]; return manager; } #pragma mark - 检测网络连接状态 + (void)checkReachability { [[AFNetworkReachabilityManager sharedManager] startMonitoring]; // 连接状态回调处理 [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { switch (status) { case AFNetworkReachabilityStatusUnknown: NSLog(@"Unkonw Collection"); break; case AFNetworkReachabilityStatusNotReachable: NSLog(@"网络未连接"); // [MBProgressHUD showError:@"网络未连接"]; break; case AFNetworkReachabilityStatusReachableViaWWAN: NSLog(@"WWAN Collection"); break; case AFNetworkReachabilityStatusReachableViaWiFi: NSLog(@"WiFi Collection"); break; } }]; } #pragma mark - 拼接出完整的URL + (NSString *)getURLStrByRequsetKey:(NSString *)requestKey { /** 可以传入完整URL地址 会自动覆盖主API */ if ([requestKey hasPrefix:@"http://"] || [requestKey hasPrefix:@"https://"]) { return [requestKey stringByRemovingPercentEncoding]; } NSString *URLStr = [[HOST_ADDRESS stringByAppendingPathComponent:[NSString stringWithFormat:@"%@%@",EXTRA_STR,requestKey]] stringByRemovingPercentEncoding]; return URLStr; } #pragma mark - 自定义cache管理 + (NSString *)cachesDirectory { NSString * cachesDirectory = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).firstObject; return cachesDirectory; } + (NSString *)cachePathWithIdentifier:(NSString *)cacheIdentifier { NSString * cachePath = [self cachesDirectory]; cachePath = [cachePath stringByAppendingPathComponent:cacheIdentifier]; BOOL isDirectory = NO; BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:cachePath isDirectory:&isDirectory]; if (fileExists == NO || isDirectory) { BOOL createFileSuccess = [[NSFileManager defaultManager] createFileAtPath:cachePath contents:nil attributes:nil]; if (createFileSuccess == NO) { NSLog(@"创建缓存文件失败"); // return nil; } else { NSLog(@"创建缓存文件成功"); // } } else { NSLog(@"缓存文件之前已存在"); // } return cachePath; } + (BOOL)saveCache:(NSDictionary *)cache withIdentifier:(NSString *)cacheIdentifier { NSCAssert([cache isKindOfClass:[NSDictionary class]], @"缓存对象不是字典类型"); NSString * cachePath = [self cachePathWithIdentifier:cacheIdentifier]; BOOL saveSuccess = [cache writeToFile:cachePath atomically:YES]; if (saveSuccess) { NSLog(@"储存缓存记录成功"); return saveSuccess; } else { NSLog(@"储存缓存记录失败"); return saveSuccess; } } + (NSDictionary *)cacheWithIdentifier:(NSString *)cacheIdentifier { NSString * cachePath = [XSHttpTool cachePathWithIdentifier:cacheIdentifier]; NSDictionary * cache = [NSDictionary dictionaryWithContentsOfFile:cachePath]; if (cache) { NSLog(@"并不存在缓存"); } NSError * error = nil; NSDictionary * cacheFileAttributes = [[NSFileManager defaultManager]attributesOfItemAtPath:cachePath error:&error]; if (error) { NSLog(@"缓存已过期"); } else if ([[NSDate date]timeIntervalSince1970] - [cacheFileAttributes.fileModificationDate timeIntervalSince1970] > JSON_CACHE_DURATION) { NSLog(@"缓存已过期"); BOOL removeCacheSuccess = [[NSFileManager defaultManager] removeItemAtPath:cachePath error:&error]; if (removeCacheSuccess) { NSLog(@"移除已过期的缓存成功"); } else { NSLog(@"移除已过期的缓存失败"); } return nil; } else { } return cache; } @end