首页 > 代码库 > [iOS 多线程 & 网络 - 2.9] - ASI框架
[iOS 多线程 & 网络 - 2.9] - ASI框架
A.ASI基本知识
1.ASI简单介绍
ASI:全称是ASIHTTPRequest,外号“HTTP终结者”,功能十分强大。
ASI的实现基于底层的CFNetwork框架,因此运行效率很高。
ASI的github地址
https://github.com/pokeb/asi-http-request
ASI的使用参考
http://www.cnblogs.com/dotey/archive/2011/05/10/2041966.html
http://www.cnblogs.com/dotey/archive/2011/05/10/2041966.html
http://www.oschina.net/question/54100_36184
2.ASI的使用
(1)导入
下载并导入ASI框架,注意该框架依赖于Reachability.
(2)ASI的源码需要设置为非ARC编译:
ASI依赖框架:
B.基本使用
创建请求对象 ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
1.发送GET & POST请求
(1)GET请求
1 /** get请求 */ 2 - (void)sendByGet{ 3 // 创建请求 4 NSURL *url = [NSURL URLWithString:@"http://192.168.0.21:8080/MyTestServer/login?user=tom&password=123"]; 5 ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 6 7 // 设置请求 8 request.timeOutSeconds = 10; // 超时时间 9 request.delegate = self;10 11 // 使用selector处理请求返回数据12 [request setDidStartSelector:@selector(startRequest)];13 14 // 发送请求15 [request startSynchronous]; // 同步请求16 }17 18 /** 请求开始 */19 - (void) startRequest20 NSLog(@"请求开始")21 }
(2)POST请求
a.设置请求方法
request.requestMethod = @"POST";
b.设置请求体,设置请求内容
[request setPostValue]
方法1:
1 #pragma mark - POST 2 - (void) sendByPost { 3 // 创建请求 4 NSURL *url = [NSURL URLWithString:@"http://192.168.0.21:8080/MyTestServer/login"]; 5 self.request = [ASIHTTPRequest requestWithURL:url]; 6 7 // 设置请求方法 8 self.request.requestMethod = @"POST"; 9 10 // 设置请求体11 [self.request appendPostData:[@"name=tom&password=123" dataUsingEncoding:NSUTF8StringEncoding]];12 // [self.request setPostLength:self.request.postBody.length];13 // [self.request addRequestHeader:[NSString stringWithFormat:@"%d", self.request.postBody.length] value:@"Content-Length"];14 // [self.request addRequestHeader:@"application/x-www-form-urlencoded" value:@"Content-Type"];15 16 self.request.completionBlock = ^ {17 NSLog(@"请求完毕");18 };19 // 发送请求20 [self.request startAsynchronous];21 }
#mark:此项失败!服务器没有收到数据!建议使用方法2
方法2:使用ASIFormDataRequest
1 - (void) sendByPost2 { 2 // 创建请求 3 NSURL *url = [NSURL URLWithString:@"http://192.168.0.21:8080/MyTestServer/login"]; 4 self.formRequest = [ASIFormDataRequest requestWithURL:url]; 5 6 // 添加请求参数 7 [self.formRequest addPostValue:@"tom" forKey:@"user"]; 8 [self.formRequest addPostValue:@"123" forKey:@"password"]; 9 10 self.formRequest.completionBlock = ^ {11 NSLog(@"请求完毕");12 };13 14 // 发送请求15 [self.formRequest startAsynchronous];16 }
注意add和set的区别,一个是添加(适用于多值参数),一个是覆盖(内部先remove,再add)。
2.发送同步 & 异步请求
(1)发送同步请求
[request sendSynchronous];
(2)发送异步请求
[request sendAsynchronous];
1 // 发送请求2 [request startSynchronous]; // 同步请求3 // [request startAsynchronous]; // 异步请求
3.处理返回信息
(1)request属性
- request.error
- request.responseStatusCode
- request.responseStatusMessage
- request.responseData
- request.responseString
发送请求后:
1 if (request.error) {2 NSLog(@"请求出错");3 }
(2)使用代理
遵守 <ASIHTTPRequestDelegate>
1 /** get请求 */ 2 - (void)sendByGet{ 3 // 创建请求 4 NSURL *url = [NSURL URLWithString:@"http://192.168.0.21:8080/MyTestServer/login?user=tom&password=123"]; 5 ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 6 7 // 设置请求 8 request.delegate = self; 9 // 发送请求10 [request startAsynchronous]; // 异步请求11 }12 13 #pragma mark - ASIHTTPRequestDelegate14 /** 使用代理处理请求事件 */15 - (void)request:(ASIHTTPRequest *)request didReceiveData:(NSData *)data {16 NSLog(@"正在接受数据");17 }18
(3)使用selector(基于代理方法,会覆盖代理方法)
====>此方法也要设置代理
1 /** get请求 */ 2 - (void)sendByGet{ 3 // 创建请求 4 NSURL *url = [NSURL URLWithString:@"http://192.168.0.21:8080/MyTestServer/login?user=tom&password=123"]; 5 ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 6 7 // 设置请求 8 request.delegate = self; 9 10 // 使用selector处理请求事件11 [request setDidStartSelector:@selector(startRequest)];12 // 发送请求13 [request startAsynchronous]; // 异步请求14 }15 16 /** 请求开始 */17 - (void) startRequest {18 NSLog(@"请求开始");19 }
(4)使用block
开启block:[request setStartedBlock:(void ^block)];
接收数据block:[request setDataReceive:(void ^block)];
结束block:[request setCompletionBlock:(void ^block)];
1 /** get请求 */ 2 - (void)sendByGet{ 3 // 创建请求 4 NSURL *url = [NSURL URLWithString:@"http://192.168.0.21:8080/MyTestServer/login?user=tom&password=123"]; 5 ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 6 7 // 设置请求 8 request.timeOutSeconds = 10; // 超时时间 9 request.delegate = self;10 11 // 使用block处理请求事件12 [request setCompletionBlock:^{13 NSLog(@"请求完成!");14 }];15 16 // 发送请求17 [request startAsynchronous]; // 异步请求18 }
4.其实,需要把request作为成员变量,控制器被销毁,切记要先取消、清除request
====> 否则request的response返回的时候会发生野指针错误
1 @interface ViewController () <ASIHTTPRequestDelegate> 2 @property(nonatomic, strong) ASIHTTPRequest *request; 3 @end 4 5 #pragma mark - dealloc 6 /** 控制器销毁之前,一定要取消、清除成员request代理 */ 7 - (void)dealloc { 8 [self.request clearDelegatesAndCancel]; 9 self.request = nil;10 }
C.其他用法
1.ASIFormDataRequest继承NSOperation,可以放到queue中管理
2.网络请求状态
3.显示网络请求状态(状态栏指示动画圈)
4.支持后台网络请求
5.设置请求超时重试次数
[iOS 多线程 & 网络 - 2.9] - ASI框架
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。