新版AFNetworking2.5使用
2015-06-10 16:19
465 查看
官网下载2.5版本:http://afnetworking.com/
此文章是基于AFNetworking2.5版本的,需要看AFNetworking2.0版本的请看上一篇文章:AFNetworking2.0使用
1.检测网络状态
[objc] view
plaincopy
+ (void)netWorkStatus
{
/**
AFNetworkReachabilityStatusUnknown = -1, // 未知
AFNetworkReachabilityStatusNotReachable = 0, // 无连接
AFNetworkReachabilityStatusReachableViaWWAN = 1, // 3G 花钱
AFNetworkReachabilityStatusReachableViaWiFi = 2, // WiFi
*/
// 如果要检测网络状态的变化,必须用检测管理器的单例的startMonitoring
[[AFNetworkReachabilityManager sharedManager] startMonitoring];
// 检测网络连接的单例,网络变化时的回调方法
[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
NSLog(@"%ld", status);
}];
}
可以用来监测WWAN或者WiFi或者断网状态;)
2.JSON方式获取数据
[objc] view
plaincopy
+ (void)JSONDataWithUrl:(NSString *)url success:(void (^)(id json))success fail:(void (^)())fail;
{
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
NSDictionary *dict = @{@"format": @"json"};
// 网络访问是异步的,回调是主线程的,因此程序员不用管在主线程更新UI的事情
[manager GET:url parameters:dict success:^(AFHTTPRequestOperation *operation,
id responseObject) {
if (success) {
success(responseObject);
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"%@", error);
if (fail) {
fail();
}
}];
}
3.xml方式获取数据
[objc] view
plaincopy
+ (void)XMLDataWithUrl:(NSString *)urlStr success:(void (^)(id xml))success fail:(void (^)())fail
{
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
// 返回的数据格式是XML
manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
NSDictionary *dict = @{@"format": @"xml"};
// 网络访问是异步的,回调是主线程的,因此程序员不用管在主线程更新UI的事情
[manager GET:urlStr parameters:dict success:^(AFHTTPRequestOperation *operation, id responseObject) {
if (success) {
success(responseObject);
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"%@", error);
if (fail) {
fail();
}
}];
}
4.post提交json数据
[objc] view
plaincopy
+ (void)postJSONWithUrl:(NSString *)urlStr parameters:(id)parameters success:(void (^)(id responseObject))success fail:(void (^)())fail
{
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
// 设置请求格式
manager.requestSerializer = [AFJSONRequestSerializer serializer];
// 设置返回格式
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
[manager POST:urlStr parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
// NSString *result = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
if (success) {
success(responseObject);
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"%@", error);
if (fail) {
fail();
}
}];
}
5.下载文件
[objc] view
plaincopy
+ (void)sessionDownloadWithUrl:(NSString *)urlStr success:(void (^)(NSURL *fileURL))success fail:(void (^)())fail
{
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:config];
NSString *urlString = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *url = [NSURL URLWithString:urlString];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
NSURLSessionDownloadTask *task = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
// 指定下载文件保存的路径
// NSLog(@"%@ %@", targetPath, response.suggestedFilename);
// 将下载文件保存在缓存路径中
NSString *cacheDir = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
NSString *path = [cacheDir stringByAppendingPathComponent:response.suggestedFilename];
// URLWithString返回的是网络的URL,如果使用本地URL,需要注意
// NSURL *fileURL1 = [NSURL URLWithString:path];
NSURL *fileURL = [NSURL fileURLWithPath:path];
// NSLog(@"== %@ |||| %@", fileURL1, fileURL);
if (success) {
success(fileURL);
}
return fileURL;
} completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
NSLog(@"%@ %@", filePath, error);
if (fail) {
fail();
}
}];
[task resume];
}
6.文件上传-自定义上传文件名
[objc] view
plaincopy
+ (void)postUploadWithUrl:(NSString *)urlStr fileUrl:(NSURL *)fileURL fileName:(NSString *)fileName fileType:(NSString *)fileTye success:(void (^)(id responseObject))success fail:(void (^)())fail
{
// 本地上传给服务器时,没有确定的URL,不好用MD5的方式处理
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
//@"http://localhost/demo/upload.php"
[manager POST:urlStr parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
// NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@"头像1.png" withExtension:nil];
// 要上传保存在服务器中的名称
// 使用时间来作为文件名 2014-04-30 14:20:57.png
// 让不同的用户信息,保存在不同目录中
// NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
// // 设置日期格式
// formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
// NSString *fileName = [formatter stringFromDate:[NSDate date]];
//@"image/png"
[formData appendPartWithFileURL:fileURL name:@"uploadFile" fileName:fileName mimeType:fileTye error:NULL];
} success:^(AFHTTPRequestOperation *operation, id responseObject) {
if (success) {
success(responseObject);
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
if (fail) {
fail();
}
}];
}
7.文件上传-随机生成文件名
[objc] view
plaincopy
+ (void)postUploadWithUrl:(NSString *)urlStr fileUrl:(NSURL *)fileURL success:(void (^)(id responseObject))success fail:(void (^)())fail
{
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
// AFHTTPResponseSerializer就是正常的HTTP请求响应结果:NSData
// 当请求的返回数据不是JSON,XML,PList,UIImage之外,使用AFHTTPResponseSerializer
// 例如返回一个html,text...
//
// 实际上就是AFN没有对响应数据做任何处理的情况
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
// formData是遵守了AFMultipartFormData的对象
[manager POST:urlStr parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
// 将本地的文件上传至服务器
// NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@"头像1.png" withExtension:nil];
[formData appendPartWithFileURL:fileURL name:@"uploadFile" error:NULL];
} success:^(AFHTTPRequestOperation *operation, id responseObject) {
// NSString *result = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
//
// NSLog(@"完成 %@", result);
if (success) {
success(responseObject);
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"错误 %@", error.localizedDescription);
if (fail) {
fail();
}
}];
AFNetworking 2.5.0版本的使用
http://afnetworking.com/
http://cocoadocs.org/docsets/AFNetworking/2.5.0/
1. 下载源码并进行编译
源码地址 http://pan.baidu.com/s/1jG24w3W
2. 判断当前是否有网络,基准网址为 http://baidu.com/
源码:
可以用来监测WWAN或者WiFi或者断网状态;)
3. 不带参数的GET请求
源码:
4. 带参数GET的请求
源码:
5. 不带参数的POST请求
源码:
6. 带参数的POST请求
源码:
附录:
基于URL-form-encodes Body方式的POST请求
7. 文件下载
8. 文件上传
单文件上传 - (没有办法做试验演示)
多文件上传 - (没有办法做试验演示)
9. Request Serialization
Request serializers create requests from URL strings, encoding parameters as either a query string or HTTP body.
请求序列化是为了从URL字符串创建出编码后的参数,或者是序列字典,或者是HTTP实体.
QUERY STRING PARAMETER
ENCODING
字符串序列编码
URL FORM PARAMETER ENCODING
URL表单编码
JSON PARAMETER ENCODING
JSON编码
注: POST分为JSON或者URL表单编码
此文章是基于AFNetworking2.5版本的,需要看AFNetworking2.0版本的请看上一篇文章:AFNetworking2.0使用
1.检测网络状态
[objc] view
plaincopy
+ (void)netWorkStatus
{
/**
AFNetworkReachabilityStatusUnknown = -1, // 未知
AFNetworkReachabilityStatusNotReachable = 0, // 无连接
AFNetworkReachabilityStatusReachableViaWWAN = 1, // 3G 花钱
AFNetworkReachabilityStatusReachableViaWiFi = 2, // WiFi
*/
// 如果要检测网络状态的变化,必须用检测管理器的单例的startMonitoring
[[AFNetworkReachabilityManager sharedManager] startMonitoring];
// 检测网络连接的单例,网络变化时的回调方法
[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
NSLog(@"%ld", status);
}];
}
可以用来监测WWAN或者WiFi或者断网状态;)
// 基准baseURL
BOOL isExistenceNetwork = YES; NSURL *baseURL = [NSURL URLWithString:@"http://baidu.com/"]; AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc]
initWithBaseURL:baseURL]; NSOperationQueue *operationQueue = manager.operationQueue; [manager.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { switch (status) { case AFNetworkReachabilityStatusReachableViaWWAN:
isExistenceNetwork = YES;
break; case AFNetworkReachabilityStatusReachableViaWiFi: isExistenceNetwork = YES;break;
case AFNetworkReachabilityStatusNotReachable:
default: [operationQueue setSuspended:YES]; // 此处可以发送断网通知
isExistenceNetwork = NO;
break; }
if (!isExistenceNetwork) { MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES]; //MBProgressHUD为第三方库,不需要可以省略或使用AlertView hud.removeFromSuperViewOnHide =YES; hud.mode = MBProgressHUDModeText; hud.labelText = NSLocalizedString(INFO_NetNoReachable, nil); hud.minSize = CGSizeMake(132.f, 108.0f); [hud hide:YES afterDelay:3]; } }];
2.JSON方式获取数据
[objc] view
plaincopy
+ (void)JSONDataWithUrl:(NSString *)url success:(void (^)(id json))success fail:(void (^)())fail;
{
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
NSDictionary *dict = @{@"format": @"json"};
// 网络访问是异步的,回调是主线程的,因此程序员不用管在主线程更新UI的事情
[manager GET:url parameters:dict success:^(AFHTTPRequestOperation *operation,
id responseObject) {
if (success) {
success(responseObject);
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"%@", error);
if (fail) {
fail();
}
}];
}
3.xml方式获取数据
[objc] view
plaincopy
+ (void)XMLDataWithUrl:(NSString *)urlStr success:(void (^)(id xml))success fail:(void (^)())fail
{
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
// 返回的数据格式是XML
manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
NSDictionary *dict = @{@"format": @"xml"};
// 网络访问是异步的,回调是主线程的,因此程序员不用管在主线程更新UI的事情
[manager GET:urlStr parameters:dict success:^(AFHTTPRequestOperation *operation, id responseObject) {
if (success) {
success(responseObject);
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"%@", error);
if (fail) {
fail();
}
}];
}
4.post提交json数据
[objc] view
plaincopy
+ (void)postJSONWithUrl:(NSString *)urlStr parameters:(id)parameters success:(void (^)(id responseObject))success fail:(void (^)())fail
{
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
// 设置请求格式
manager.requestSerializer = [AFJSONRequestSerializer serializer];
// 设置返回格式
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
[manager POST:urlStr parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
// NSString *result = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
if (success) {
success(responseObject);
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"%@", error);
if (fail) {
fail();
}
}];
}
5.下载文件
[objc] view
plaincopy
+ (void)sessionDownloadWithUrl:(NSString *)urlStr success:(void (^)(NSURL *fileURL))success fail:(void (^)())fail
{
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:config];
NSString *urlString = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *url = [NSURL URLWithString:urlString];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
NSURLSessionDownloadTask *task = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
// 指定下载文件保存的路径
// NSLog(@"%@ %@", targetPath, response.suggestedFilename);
// 将下载文件保存在缓存路径中
NSString *cacheDir = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
NSString *path = [cacheDir stringByAppendingPathComponent:response.suggestedFilename];
// URLWithString返回的是网络的URL,如果使用本地URL,需要注意
// NSURL *fileURL1 = [NSURL URLWithString:path];
NSURL *fileURL = [NSURL fileURLWithPath:path];
// NSLog(@"== %@ |||| %@", fileURL1, fileURL);
if (success) {
success(fileURL);
}
return fileURL;
} completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
NSLog(@"%@ %@", filePath, error);
if (fail) {
fail();
}
}];
[task resume];
}
6.文件上传-自定义上传文件名
[objc] view
plaincopy
+ (void)postUploadWithUrl:(NSString *)urlStr fileUrl:(NSURL *)fileURL fileName:(NSString *)fileName fileType:(NSString *)fileTye success:(void (^)(id responseObject))success fail:(void (^)())fail
{
// 本地上传给服务器时,没有确定的URL,不好用MD5的方式处理
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
//@"http://localhost/demo/upload.php"
[manager POST:urlStr parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
// NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@"头像1.png" withExtension:nil];
// 要上传保存在服务器中的名称
// 使用时间来作为文件名 2014-04-30 14:20:57.png
// 让不同的用户信息,保存在不同目录中
// NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
// // 设置日期格式
// formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
// NSString *fileName = [formatter stringFromDate:[NSDate date]];
//@"image/png"
[formData appendPartWithFileURL:fileURL name:@"uploadFile" fileName:fileName mimeType:fileTye error:NULL];
} success:^(AFHTTPRequestOperation *operation, id responseObject) {
if (success) {
success(responseObject);
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
if (fail) {
fail();
}
}];
}
7.文件上传-随机生成文件名
[objc] view
plaincopy
+ (void)postUploadWithUrl:(NSString *)urlStr fileUrl:(NSURL *)fileURL success:(void (^)(id responseObject))success fail:(void (^)())fail
{
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
// AFHTTPResponseSerializer就是正常的HTTP请求响应结果:NSData
// 当请求的返回数据不是JSON,XML,PList,UIImage之外,使用AFHTTPResponseSerializer
// 例如返回一个html,text...
//
// 实际上就是AFN没有对响应数据做任何处理的情况
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
// formData是遵守了AFMultipartFormData的对象
[manager POST:urlStr parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
// 将本地的文件上传至服务器
// NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@"头像1.png" withExtension:nil];
[formData appendPartWithFileURL:fileURL name:@"uploadFile" error:NULL];
} success:^(AFHTTPRequestOperation *operation, id responseObject) {
// NSString *result = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
//
// NSLog(@"完成 %@", result);
if (success) {
success(responseObject);
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"错误 %@", error.localizedDescription);
if (fail) {
fail();
}
}];
AFNetworking 2.5.0版本的使用
http://afnetworking.com/
http://cocoadocs.org/docsets/AFNetworking/2.5.0/
1. 下载源码并进行编译
源码地址 http://pan.baidu.com/s/1jG24w3W
2. 判断当前是否有网络,基准网址为 http://baidu.com/
源码:
可以用来监测WWAN或者WiFi或者断网状态;)
// 基准baseURL
NSURL *baseURL = [NSURL URLWithString:@"http://baidu.com/"];
AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:baseURL];
NSOperationQueue *operationQueue = manager.operationQueue;
[manager.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
switch (status) {
case AFNetworkReachabilityStatusReachableViaWWAN:
case AFNetworkReachabilityStatusReachableViaWiFi:
[operationQueue setSuspended:NO];
// 此处可以发送有网络通知
NSLog(@"有网络");
break;
case AFNetworkReachabilityStatusNotReachable:
default:
[operationQueue setSuspended:YES];
// 此处可以发送断网通知
NSLog(@"断网了");
break;
}
}];
// 开始监测网络
[manager.reachabilityManager startMonitoring];
3. 不带参数的GET请求
源码:
// 初始化网址 NSString *requestAddress = \ @"http://api.openweathermap.org/data/2.5/forecast/daily?lat=39.88293652833437&lon=116.4621119300779&lang=zh_cn"; AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; // 不带参数的GET请求 [manager GET:requestAddress parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"%@", responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"%@", error); }];
4. 带参数GET的请求
源码:
// 初始化网址 NSString *requestAddress = \ @"http://api.openweathermap.org/data/2.5/forecast/daily"; AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; // 参数的GET请求 [manager GET:requestAddress parameters:@{@"lat" : @"39.88293652833437", @"lon" : @"116.4621119300779", @"lang" : @"zh_cn"} success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"%@", responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"%@", error); }];
5. 不带参数的POST请求
源码:
// 初始化网址 NSString *cityName = [@"北京" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSString *requestAddress = \ [NSString stringWithFormat:@"http://apis.haoservice.com/weather?cityname=%@&key=1d309cc633984df791b51f48ddf09d4b", cityName]; AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; manager.responseSerializer.acceptableContentTypes = \ [manager.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"]; // 不带参数的POST请求 [manager POST:requestAddress parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"%@", responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"%@", error); }];
6. 带参数的POST请求
源码:
// 初始化网址 NSString *cityName = [@"北京" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSString *requestAddress = \ [NSString stringWithFormat:@"http://apis.haoservice.com/weather"]; AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; manager.responseSerializer.acceptableContentTypes = \ [manager.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"]; // 带参数的POST请求 [manager POST:requestAddress parameters:@{@"cityname" : cityName, @"key" : @"1d309cc633984df791b51f48ddf09d4b"} success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"%@", responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"%@", error); }];
附录:
基于URL-form-encodes Body方式的POST请求
// 初始化网址 NSString *cityName = [@"北京" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSString *requestAddress = \ [NSString stringWithFormat:@"http://apis.haoservice.com/weather"]; AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; // 创建 URL-form-encodes HTTP message bodies manager.requestSerializer = [AFJSONRequestSerializer serializer]; // 接受的数据类型 manager.responseSerializer.acceptableContentTypes = \ [manager.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"]; // 带参数的POST请求 [manager POST:requestAddress parameters:@{@"cityname" : cityName, @"key" : @"1d309cc633984df791b51f48ddf09d4b"} success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"%@", responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"%@", error); }];
7. 文件下载
// // ViewController.m // AFNetworking2.5.0 // // Created by XianMingYou on 15/2/14. // Copyright (c) 2015年 XianMingYou. All rights reserved. // #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // 定义一个progress指针 NSProgress *progress; // 创建一个URL链接 NSURL *url = [NSURL URLWithString:@"http://41.duote.com.cn/2345explorer.exe"]; // 初始化一个请求 NSURLRequest *request = [NSURLRequest requestWithURL:url]; // 获取一个Session管理器 AFHTTPSessionManager *session = [AFHTTPSessionManager manager]; // 开始下载任务 NSURLSessionDownloadTask *downloadTask = \ [session downloadTaskWithRequest:request progress:&progress destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) { // 拼接一个文件夹路径 NSURL *documentsDirectoryURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil]; // 根据网址信息拼接成一个完整的文件存储路径并返回给block return [documentsDirectoryURL URLByAppendingPathComponent:[response suggestedFilename]]; } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) { // 结束后移除掉这个progress [progress removeObserver:self forKeyPath:@"fractionCompleted" context:nil]; }]; // 设置这个progress的唯一标示符 [progress setUserInfoObject:@"someThing" forKey:@"Y.X."]; [downloadTask resume]; // 给这个progress添加监听任务 [progress addObserver:self forKeyPath:@"fractionCompleted" options:NSKeyValueObservingOptionNew context:nil]; } - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if ([keyPath isEqualToString:@"fractionCompleted"] && [object isKindOfClass:[NSProgress class]]) { NSProgress *progress = (NSProgress *)object; NSLog(@"Progress is %f", progress.fractionCompleted); } } @end
8. 文件上传
单文件上传 - (没有办法做试验演示)
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration]; NSURL *URL = [NSURL URLWithString:@"http://example.com/upload"]; NSURLRequest *request = [NSURLRequest requestWithURL:URL]; NSURL *filePath = [NSURL fileURLWithPath:@"file://path/to/image.png"]; NSURLSessionUploadTask *uploadTask = [manager uploadTaskWithRequest:request fromFile:filePath progress:nil completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) { if (error) { NSLog(@"Error: %@", error); } else { NSLog(@"Success: %@ %@", response, responseObject); } }]; [uploadTask resume];
多文件上传 - (没有办法做试验演示)
NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:@"http://example.com/upload" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { [formData appendPartWithFileURL:[NSURL fileURLWithPath:@"file://path/to/image.jpg"] name:@"file" fileName:@"filename.jpg" mimeType:@"image/jpeg" error:nil]; } error:nil]; AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; NSProgress *progress = nil; NSURLSessionUploadTask *uploadTask = [manager uploadTaskWithStreamedRequest:request progress:&progress completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) { if (error) { NSLog(@"Error: %@", error); } else { NSLog(@"%@ %@", response, responseObject); } }]; [uploadTask resume];
9. Request Serialization
Request serializers create requests from URL strings, encoding parameters as either a query string or HTTP body.
请求序列化是为了从URL字符串创建出编码后的参数,或者是序列字典,或者是HTTP实体.
NSString *URLString = @"http://example.com"; NSDictionary *parameters = @{@"foo": @"bar", @"baz": @[@1, @2, @3]};
QUERY STRING PARAMETER
ENCODING
字符串序列编码
[[AFHTTPRequestSerializer serializer] requestWithMethod:@"GET" URLString:URLString parameters:parameters error:nil];
GET请求 http://example.com?foo=bar&baz[]=1&baz[]=2&baz[]=3
URL FORM PARAMETER ENCODING
URL表单编码
[[AFHTTPRequestSerializer serializer] requestWithMethod:@"POST" URLString:URLString parameters:parameters];
POST请求 http://example.com/ Content-Type: application/x-www-form-urlencoded foo=bar&baz[]=1&baz[]=2&baz[]=3
JSON PARAMETER ENCODING
JSON编码
[[AFJSONRequestSerializer serializer] requestWithMethod:@"POST" URLString:URLString parameters:parameters];
POST请求 http://example.com/ Content-Type: application/json {"foo": "bar", "baz": [1,2,3]}
注: POST分为JSON或者URL表单编码
相关文章推荐
- ASP.NET 在请求中检测到有潜在危险的 Request.Form 值。
- 也谈分离JavaScript和HTML
- LeetCode86:Partition List
- 16 行为型模式-----备忘录模式
- 原来老外也喜欢盖楼
- sql having 函数 按匿名字段作为条件进行查询
- Android基础教程(二)之五大布局对象---FrameLayout,LinearLayout ,AbsoluteLayout,RelativeLayout,TableLayout.
- android多个fragment返回键层层返回
- [Python]网络爬虫(五):urllib2的使用细节与抓站技巧
- 统计c程序的一个设计,牛小芙老大的课程设计。觉得不错,收藏了。
- Unity5.0.2工程出现的错误处理
- 索引键的唯一性(3/4):唯一聚集索引上的唯一和非唯一非聚集索引
- 索引键的唯一性(2/4):唯一与非唯一聚集索引
- 用Go语言做产品半年的一些感觉
- ZeroMQ的进阶
- 2-3 矢量格式图像-1-4
- mysql 不能对同一个表进行 update(delete) 和 select 联合操作
- NSString
- win2008 R2 64位系统下配置DCOM权限
- GRE逻辑写作解析