看到某某银行的客户端网络请求还是比较老的框架ASI、并且还是手动管理内存(非ARC),现在基本上网络请求用的都是AFN,所以对ASI已经很久没碰了,现在要重新整理把以前的东东都捡起来,方便以后如果再次遇到这种情况能够很快上手(祈祷在也碰不到了)
一:概念:全称是ASIHTTPRequest,江湖人称“HTTP终结者”,底层基于C的CFNetwork框架,运行效率很高功能十分强大,只可惜作者很早已不更新,所以一些潜在的bug无人去解决。这么好用的东西不更新,确实可惜。
github地址
https://github.com/pokeb/asi-http-request
二:用法
(1)把所需要的文件导入工程,并添加依赖库:
(2)监听请求
a.第一种block的形式
// 1.URL
NSURL *url = [NSURL URLWithString:@"http://xxxxxxxxxxx"];
// 2.创建一个请求对象
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
//超时时间
request.timeOutSeconds = 30;
// 3.开始请求
[request startAsynchronous];
// 4.设置block监听
[request setStartedBlock:^{
NSLog(@"开始请求的时候调用");
}];
[request setCompletionBlock:^{
NSLog(@"请求完成的时候调用");
}];
[request setFailedBlock:^{
NSLog(@"请求失败的时候调用");
}];
//不要忘记在控制器销毁的时候要取消请求(这个很重要,要不然很容易报野指针错误问题)
-(void)dealloc
{
[self.request clearDelegatesAndCancel];
}
b.第二种:设置代理,不需要遵守ASIHTTPRequestDelegate协议,自定义代理方法
// 1.URL
NSURL *url = [NSURL URLWithString:@"http://xxxxxxxxxx"];
// 2.创建一个请求对象
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
//超时时间
request.timeOutSeconds = 30;
// 3.开始请求
[request startAsynchronous];
// 4.设置监听方法
request.delegate = self;
//请求开始的时候就会调用代理的start方法
[request setDidStartSelector:@selector(start:)];
//请求完成的时候就会调用代理的finish方法
[request setDidFinishSelector:@selector(finish:)];
c.第三种:就比较麻烦了,也是调用代理的方法,个人不建议用。前面两种就已经够了,不需要太在意。
- (void)requestStarted:(ASIHTTPRequest *)request;
- (void)request:(ASIHTTPRequest *)request didReceiveResponseHeaders:(NSDictionary *)responseHeaders;
- (void)request:(ASIHTTPRequest *)request didReceiveData:(NSData *)data;
- (void)requestFinished:(ASIHTTPRequest *)request;
- (void)requestFailed:(ASIHTTPRequest *)request;
d.发送post请求
导入#import “ASIFormDataRequest.h”文件
ASIFormDataRequest的作用就是发送post请求
// 1.URL
NSURL *url = [NSURL URLWithString:@"http://xxxxxxxxxx"];
// 2.创建一个请求对象
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
request.timeOutSeconds = 30;
// 3.设置请求参数
[request setPostValue:@"lifufa" forKey:@"username"];
[request setPostValue:@"lifufa" forKey:@"pwd"];
// 4.开始请求
[request startAsynchronous];
// 5.设置监听方法
__weak typeof(request) weakRequest = request;
[request setCompletionBlock:^{
NSLog(@"请求完毕--%@", [weakRequest responseString]);
}];
[request setFailedBlock:^{
NSLog(@"请求失败--%@", [weakRequest responseString]);
}];
三:一些在开发中可能用到的方法
(1)设置请求超时后重试的次数
request.numberOfTimesToRetryOnTimeout = 3; // 重试3次
(2)当应用后台运行时,是否仍然继续处理网络请求
request.shouldContinueWhenAppEntersBackground = YES;
(3)当正在请求时,是否要在状态栏显示联网状态(转圈圈)
[ASIHTTPRequest setShouldUpdateNetworkActivityIndicator:YES];
四:文件下载
// 1.URL
NSURL *url = [NSURL URLWithString:@"http://xxxxxxxxxxx"];
// 2.创建一个请求对象
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
// 3.设置文件的缓存路径
NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
NSString *filepath = [caches stringByAppendingPathComponent:@"test1.mp4"];
request.downloadDestinationPath = filepath;
// 4.设置进度监听的代理(要想成为进度监听代理,最好遵守ASIProgressDelegate协议)
request.downloadProgressDelegate = self;
// 这个属性设置为YES,就会支持断点下载
request.allowResumeForFileDownloads = YES;
// 如果要实现断点续传,需要设置一个文件的临时路径,NSTemporaryDirectory()代表temp路径
request.temporaryFileDownloadPath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"test.temp"];
// 5.开始请求
[request startAsynchronous];
五:文件上传
// 1.URL
NSURL *url = [NSURL URLWithString:@”http://xxxxxxxxxxxxxx“];
// 2.创建一个请求对象
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
// 3.设置请求参数
[request setPostValue:@"lifufa" forKey:@"username"];
[request setPostValue:@"lifufa" forKey:@"pwd"];
// 设置文件参数
NSString *file = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"mp4"];
// 如果知道文件路径,最好就用这个方法(因为简单)
// ASI内部会自动识别文件的MIMEType
[request setFile:file forKey:@"file"];
// 如果文件数据是动态产生的,就用这个方法.
// [request setData:<#(id)#> withFileName:<#(NSString )#> andContentType:<#(NSString )#> forKey:<#(NSString *)#>];
// 4.可以设置监听上传进度的代理
request.uploadProgressDelegate = self;
// 5.开始请求
[request startAsynchronous];
// 6.监听完毕
__weak typeof(request) weakRequest = request;
[request setCompletionBlock:^{
NSLog(@"%@", [weakRequest responseString]);
}];
“`
了解以上这些应该就能解决老的项目请求问题,这个框架确实很牛逼。比起AFN来说,如果作者能够更新,本人还是更喜欢ASI.随着swift的普及,ASI将会加速推出历史舞台。一个崭新的网络框架已经普及,并得到大家认可。回首过往可惜的同事更多的是尊重与敬佩!