封装网络请求,下载,上传功能
来源:互联网 发布:华为liteos 源码下载 编辑:程序博客网 时间:2024/06/07 09:56
对于网络数据请求每个人都能想出很多自己的方法,使用第三方,自己封装苹果自带的,不管哪家的,自己学会就是自己的拉 废话少说 上码
//// ConnectionUtil.h// BlocksConnectionDemo//// Created by junxinWang on 15-5-29.// Copyright (c) 2015年 junxinWang. All rights reserved.//#import <Foundation/Foundation.h>typedef enum requestMethod { RequestMethodGet, RequestMethodPost}RequestMethod;typedef enum downloadType { downloadImage, downloadMove}DownLoadType;typedef enum uploadType { uploadImage, uploadMove}UpLoadType;typedef void (^POSTRequest) (id objc);typedef void (^DownLoad) (id objc);typedef void (^UpLoad) (id objc);typedef void (^Progress) (float progress);typedef void (^Error) (NSError *error);@interface ConnectionUtil : NSObject+ (ConnectionUtil *)sharconn;@property (nonatomic, strong) NSData *data;@property (nonatomic, strong) NSDictionary *paramDIc;@property (nonatomic) RequestMethod requestMethod;//请求方式@property (nonatomic) DownLoadType downloadtype;//下载的类型@property (nonatomic) UpLoadType uploadtype;//上传类型@property (nonatomic, copy) POSTRequest postConn;@property (nonatomic, copy) DownLoad download;@property (nonatomic, copy) UpLoad upload;@property (nonatomic, copy) Progress postPro;@property (nonatomic, copy) Error error;+ (void)connection:(POSTRequest)postConn postConnError:(Error)error;+ (void)connectionDown:(DownLoad)download downError:(Error)error;+ (void)connectionUpload:(UpLoad)upload uploaError:(Error)error;+ (void)downloadProgress:(Progress)postPro error:(Error)error;- (void)startConn:(NSString *)url requestMedth:(RequestMethod)type param:(NSDictionary *)param;- (void)downLoadConn:(NSString *)url;- (void)uploadConn:(NSString *)url uploadtype:(UpLoadType)uploadtype param:(NSDictionary *)param;- (void)stopConn;@end
//// ConnectionUtil.m// BlocksConnectionDemo//// Created by junxinWang on 15-5-29.// Copyright (c) 2015年 junxinWang. All rights reserved.//#import "ConnectionUtil.h"#import <UIKit/UIKit.h>@interface ConnectionUtil ()<NSURLConnectionDelegate,NSURLConnectionDataDelegate,NSURLSessionDownloadDelegate>@property (nonatomic, retain) NSURLConnection *connection;//连接对象@property (nonatomic, strong) NSURLSession *urlsession;//普通回话@property (nonatomic, strong) NSURLSession *backgroundSession;//后台回话@property (nonatomic, strong) NSURLSessionDownloadTask *sessionDownloadTask;//下载队列@property (nonatomic,strong)NSURLSessionDownloadTask *backgroundTask;//后台下载队列@property (nonatomic, strong) NSData *partiaData;//下载局部数据@property (nonatomic, strong) NSOutputStream *outputStream;@property (nonatomic, copy) NSString *urlpath;@end@implementation ConnectionUtilstatic ConnectionUtil *connhelp = nil;+ (ConnectionUtil *)sharconn { static dispatch_once_t oneTonke; dispatch_once(&oneTonke, ^{ connhelp = [[self alloc] init]; }); return connhelp;}- (void)startConn:(NSString *)url requestMedth:(RequestMethod)type param:(NSDictionary *)param{ self.paramDIc = param; NSURL *urlconn = [NSURL URLWithString:[self getStringWithUrl:url]]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:urlconn]; if (RequestMethodPost == type) { [request setHTTPBody:[self postBody]]; [request setHTTPMethod:@"POST"]; } self.connection = [NSURLConnection connectionWithRequest:request delegate:self]; // [conn start]; }- (void)stopConn { [self.connection cancel];}- (NSString *)getStringWithUrl:(NSString *)str { switch (self.requestMethod) { case RequestMethodPost: return [str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; break; case RequestMethodGet: return str; default: break; }}//获取post请求 请求体- (NSData *)postBody { return [[self appedData] dataUsingEncoding:NSUTF8StringEncoding];}//将字典中的参数拼接成字符串- (NSString *)appedData { NSMutableString *urlstr = [NSMutableString stringWithCapacity:1]; for (NSString *key in self.paramDIc) { NSString *value = self.paramDIc[key]; [urlstr appendFormat:@"&%@=%@",key,value]; } //剔除第一个&符 [urlstr deleteCharactersInRange:NSMakeRange(0, 1)]; return urlstr;}- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { NSLog(@"链接服务器...");}- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {// NSString *String =[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; self.data = data;}- (void)connectionDidFinishLoading:(NSURLConnection *)connection { if(self.postConn){ id obj = [NSJSONSerialization JSONObjectWithData:self.data options:NSJSONReadingMutableContainers error:nil]; self.postConn(obj); } }//请求数据失败触发 网络中断 服务器未开- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { if (self.error) { self.error(error); }}+ (void)connection:(POSTRequest)postConn postConnError:(Error)error{ connhelp.postConn = postConn; connhelp.error = error;}- (NSData *)data { if(!_data){ self.data = [NSData data]; } return _data;}- (NSDictionary *)paramDIc { if (!_paramDIc) { self.paramDIc = [NSDictionary dictionary]; } return _paramDIc;}- (void)uploadConn:(NSString *)url uploadtype:(UpLoadType)uploadtype param:(NSDictionary *)param; { NSData *imageData = UIImageJPEGRepresentation([param valueForKey:@"image"], 0.6); NSString *boundary = @"0xKhTmLbOuNdArY"; NSString *filename = [NSString stringWithFormat:@"9.jpg"]; NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary]; NSURL *upurl = [NSURL URLWithString:url]; //2 Request -put 默认是get NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:upurl cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:5.0f]; request.HTTPMethod = @"POST"; /** * 设置网络请求验证方 */ //1授权字符串 // NSString *authStr = @"admin:123456"; //2Base64的编码 避免在网络上一明文传输 //iOS中,仅对nsdata的数据类型提供base64编码// NSData *authData = [authStr dataUsingEncoding:NSUTF8StringEncoding];// NSString *encodeStr = [authData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithCarriageReturn];// NSString *authValue = [NSString stringWithFormat:@"Basic %@",encodeStr]; //[request setValue:authValue forHTTPHeaderField:@"Content-Type"]; //3Session // 4 Create object to put content into... //拼接from表单 加载上传数据 NSMutableData *body = [NSMutableData data]; [request addValue:contentType forHTTPHeaderField:@"Content-Type"]; [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithString:[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"userfile\"; filename=\"%@\"\r\n",filename]] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; // 定义上传图片的类型 // [body appendData:[@"Content-Type: image/jpeg\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[NSData dataWithData:imageData]]; [body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; //__block NSString *stringForText = @"Hola"; NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration]; NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:[NSOperationQueue mainQueue]]; //4uploadTask // NSData *imgeData = UIImageJPEGRepresentation([param valueForKey:@"image"], 0.75); //NSData *imgeData = [NSJSONSerialization dataWithJSONObject:[param valueForKey:@"upfile"] options:NSJSONWritingPrettyPrinted error:nil]; //应用block的请求方式 NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:request fromData:body completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { //上传完成后 data参数转成string就是服务器返回的内容 NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; if(self.upload){ if(error){ self.error(error); }else{ self.upload(str);} } // NSLog(@"ok%@",str); }]; //开始上传 [uploadTask resume];}+ (void)connectionUpload:(UpLoad)upload uploaError:(Error)error { connhelp.upload = upload; connhelp.error = error;}#pragma mark - 如果我们需要利用NSURLSession进行数据传输我们需要:/** * 创建一个NSURLSessionConfiguration,用于创建NSSession时设置工作模式(3种) * (1)一般模式(default):工作模式类似于原来的NSURLConnection,可以使用缓存的Cache,Cookie,鉴权。 * (2)及时模式(ephemeral):不使用缓存的Cache,Cookie,鉴权。 * (3)后台模式(background):在后台完成上传下载,创建Configuration对象的时候需要给一个NSString的ID用于追踪完成工作的Session是哪一个 */- (void)downLoadConn:(NSString *)url { NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration]; // NSURLCache *myCache = [[NSURLCache alloc] initWithMemoryCapacity: 16384 diskCapacity: 268435456 diskPath: fileName]; /** * @网络设置:参考NSURLConnection中的设置项 * 两种创建方法(目前不太懂什么区别) * (1)就是根据刚才创建的Configuration创建一个Session,系统默认创建一个新的OperationQueue处理Session的消息 * (2)可以设定回调的delegate(注意这个回调delegate会被强引用),并且可以设定delegate在哪个OperationQueue回调,如果我们将其 * 设置为[NSOperationQueue mainQueue]就能在主线程进行回调非常的方便 */ //NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfig]; //sessionConfiguration.URLCache = myCache; // sessionConfiguration.requestCachePolicy = NSURLRequestUseProtocolCachePolicy; self.urlsession = [NSURLSession sessionWithConfiguration:sessionConfiguration delegate:self delegateQueue:[NSOperationQueue mainQueue]]; //NSString *str =[url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSURL *urlconn = [NSURL URLWithString:url]; NSURLRequest *request = [NSURLRequest requestWithURL:urlconn]; /** * NSURLSessionUploadTask:上传用的Task,传完以后不会再下载返回结果; * NSURLSessionDownloadTask:下载用的Task; * NSURLSessionDataTask:可以上传内容,上传完成后再进行下载。 */ self.sessionDownloadTask = [self.urlsession downloadTaskWithRequest:request]; [_sessionDownloadTask resume]; }- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTaskdidFinishDownloadingToURL:(NSURL *)location { //下载成功后,文件是保存在一个临时目录的,需要开发者自己考到放置该文件的目录 NSURL *destination = [self createDirectoryForDownloadItemFromURL:location]; BOOL success = [self copyTempFileAtURL:location toDestination:destination]; if (success) { if (self.download) { if (downloadTask.error) { self.error(downloadTask.error); }else { self.download(downloadTask); } } }else { NSLog(@"文件保存错误"); } self.sessionDownloadTask = nil;}- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWrittentotalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite { if (self.postPro) { if (downloadTask.error) { self.error(downloadTask.error); }else{ CGFloat progress = ((float)totalBytesWritten) / totalBytesExpectedToWrite; self.postPro(progress); } }}- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffsetexpectedTotalBytes:(int64_t)expectedTotalBytes{}+ (void)downloadProgress:(Progress)postPro error:(Error)error { connhelp.postPro = postPro; connhelp.error = error;}+ (void)connectionDown:(DownLoad)download downError:(Error)error { connhelp.download = download; connhelp.error = error;}//创建文件本地保存目录-(NSURL *)createDirectoryForDownloadItemFromURL:(NSURL *)location{ NSString *newpath; NSFileManager *fileManager = [NSFileManager defaultManager]; NSArray *urls = [fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask]; NSURL *documentsDirectory = urls[0]; NSString *tmpstr = [location absoluteString]; if (self.downloadtype == downloadImage) { newpath = [tmpstr stringByReplacingCharactersInRange:NSMakeRange(tmpstr.length-4, 4) withString:@".jpg"]; }else if(self.downloadtype == downloadMove){ newpath = [tmpstr stringByReplacingCharactersInRange:NSMakeRange(tmpstr.length-4, 4) withString:@".mp4"]; } NSLog(@"%@",newpath); NSURL *url2 = [NSURL URLWithString:newpath]; return [documentsDirectory URLByAppendingPathComponent:[url2 lastPathComponent]];}//把文件拷贝到指定路径-(BOOL) copyTempFileAtURL:(NSURL *)location toDestination:(NSURL *)destination { NSError *error; NSFileManager *filemanager = [NSFileManager defaultManager]; [filemanager removeItemAtURL:destination error:nil]; // NSURL *url =[NSURL URLWithString:tmpstr]; [filemanager copyItemAtURL:location toURL:destination error:nil]; if (error == nil) { NSLog(@"转移成功"); return true; }else { NSLog(@"%@",error); return false; }}- (NSString *)getCachesImagePath { //获取caches文件夹路径 NSString *filepath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)firstObject]; //获取MP3文件夹的路径 NSString *newpath = [filepath stringByAppendingPathComponent:@"Images"]; //3判断文件夹是否存在 NSFileManager *manager = [NSFileManager defaultManager]; if (![manager fileExistsAtPath:@"newpath"]) { //没有的话创建文件夹 BOOL isSuccess = [manager createDirectoryAtPath:newpath withIntermediateDirectories:YES attributes:nil error:nil]; if (isSuccess) { // NSLog(@"images创建成功"); }else{ // NSLog(@"images创建失败"); } } return newpath;}@end
0 0
- 封装网络请求,下载,上传功能
- 网络请求,封装文件上传操作
- iOS -- NSURLSession网络请求,上传,下载
- iOS NSURLSession 实现网络请求-文件下载-上传-后台下载
- AFNetworking3.0网络请求方法封装(自带缓存功能)
- AFNetworking3.0网络请求方法封装(自带缓存功能)
- AFNetworking3.0网络请求方法封装(自带缓存功能)
- 网络编程之get,post请求,文件上传及下载
- AFN详解(检测网络状态,下载,上传,数据请求)
- 网络请求 NSURLsession(get、post、下载、上传)
- android之OkHttp使用(网络请求,上传,下载)
- iOS 开发 AFNetworking实现网络请求,上传和下载
- 封装网络请求
- 封装Ger网络请求
- 网络请求封装
- 封装网络请求(AFNetworking)
- 网络请求封装
- iOS封装网络请求
- 浅析pragma once与include guard
- 一个简单的爬虫douban_list_spider.py
- java学习记录
- 用Python实现各种排序算法
- 静态变量的初始化
- 封装网络请求,下载,上传功能
- 黑马程序员----JAVA基础----IO流_1
- linux 系统目录
- 回调函数call back最通俗易懂的解释(适合初学者)
- leveldb使用时遇到的性能问题
- map的用法
- Online Judge System For SzNOI 题库 语法百题 C++ d001
- 北京数字认证股份有限公司-数字证书认证管理解决方案
- RSA算法理解