iOS开发——网络编程OC篇&(十一)ASI了解
ASI了解
关于AFI网络框架早在2011年就已经停止更新了,现在基本上没有公司在使用,除非一些大的公司会保留一些项目在使用,所以以后我吗一般都不会接触到活着使用这个框架,但是作为一个开发者,正是因为他这么好,而且之前那么火,必须要了解或者知道一些基本的原理,
一、发送请求的2个对象
1.发送GET请求:ASIHttpRequest
2.发送POST请求:ASIFormDataRequest
* 设置参数
// 同一个key只对应1个参数值,适用于普通“单值参数”
- (void)setPostValue:(id <NSObject>)value forKey:(NSString *)key
// 同一个key(同一个参数名),会对应多个参数值,适用于“多值参数”
- (void)addPostValue:(id <NSObject>)value forKey:(NSString *)key
二、发送请求
1.同步请求
* startSynchronous
2.异步请求
* startAsynchronous
三、监听请求的过程
1.如何监听请求过程
1> 为代理,遵守ASIHTTPRequestDelegate协议,实现协议中的代理方法
request.delegate = self;
- (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;
2> 成为代理,不遵守ASIHTTPRequestDelegate协议,自定义代理方法
request.delegate = self;
[request setDidStartSelector:@selector(start:)];
[request setDidFinishSelector:@selector(finish:)];
3> 设置block
[request setStartedBlock:^{
NSLog(@"setStartedBlock");
}];
[request setHeadersReceivedBlock:^(NSDictionary *responseHeaders) {
NSLog(@"setHeadersReceivedBlock--%@", responseHeaders);
}];
[request setDataReceivedBlock:^(NSData *data) {
NSLog(@"setDataReceivedBlock--%@", data);
}];
[request setCompletionBlock:^{
NSLog(@"setCompletionBlock");
}];
[request setFailedBlock:^{
NSLog(@"setFailedBlock");
}];
2.监听的使用注意
* 如果同时设置了block和实现了代理方法,请求过程中,block和代理方法都会调用
* 一般的调用顺序:代理方法 > block
3.如果实现了下面的代理方法,那么responseData\responseString就没有值
- (void)request:(ASIHTTPRequest *)request didReceiveData:(NSData *)data;
四、文件下载
1.一般的下载
1> 设置文件下载的保存路径
request.downloadDestinationPath = filepath;
2> 设置进度监听的代理(要想成为进度监听代理,最好遵守ASIProgressDelegate协议)
request.downloadProgressDelegate = self.progressView;
2.断点下载(断点续传)
1> 设置文件下载的临时路径
request.temporaryFileDownloadPath = tempFilepath;
2> 设置支持断点续传
request.allowResumeForFileDownloads = YES;
五、文件上传(设置文件参数)
1.如果知道文件路径,最好就用这个方法(因为简单)
// ASI内部会自动识别文件的MIMEType
[request setFile:file forKey:@"file"];
[request addFile:file forKey:@"file"];
[request setFile:file withFileName:@"basic.pptx" andContentType:@"application/vnd.openxmlformats-officedocument.presentationml.presentation" forKey:@"file"];
// .....
2.如果文件数据是动态产生的,就用这个方法(比如刚拍照完获得的图片数据)
[request setData:data withFileName:@"test.png" andContentType:@"image/png" forKey:@"file"];
六、ASIHttpRequest的常见用法
1.请求超时
@property (atomic, assign) NSTimeInterval timeOutSeconds;
2.获得错误信息
@property (atomic, retain) NSError *error;
3.获得响应数据
// 状态码
@property (atomic, assign,readonly) int responseStatusCode;
// 状态信息
@property (atomic, retain,readonly) NSString *responseStatusMessage;
// 服务器返回的具体数据(NSString格式)
- (NSString *)responseString;
// 服务器返回的具体数据(NSData格式)
- (NSData *)responseData;
一:基本使用(请求)
1 /** 2 * 异步的GET请求 3 */ 4 - (void)asynGet 5 { 6 // 1.URL 7 NSURL *url = [NSURL URLWithString:@"http://localhost:8080/MJServer/video"]; 8 9 // 2.创建一个请求对象 10 ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 11 request.timeOutSeconds = 15; // 15秒后服务器还没有响应,就算超时 12 // 设置代理 13 request.delegate = self; 14 15 // 3.开始请求 16 [request startAsynchronous]; 17 18 self.request = request; 19 } 20 21 - (void)dealloc 22 { 23 // 这句代码为了防止:控制器销毁了,request还回来调用控制器的代理方法,引发野指针 24 [self.request clearDelegatesAndCancel]; 25 } 26 27 #pragma mark - ASIHTTPRequestDelegate 28 /** 29 * 1.开始发送请求 30 */ 31 - (void)requestStarted:(ASIHTTPRequest *)request 32 { 33 NSLog(@"requestStarted"); 34 } 35 /** 36 * 2.接收到服务器的响应头信息 37 */ 38 - (void)request:(ASIHTTPRequest *)request didReceiveResponseHeaders:(NSDictionary *)responseHeaders 39 { 40 NSLog(@"didReceiveResponseHeaders"); 41 } 42 /** 43 * 3.接收到服务器的实体数据(具体数据) 44 * 只要实现了这个代理方法,responseData\responseString就没有值 45 */ 46 //- (void)request:(ASIHTTPRequest *)request didReceiveData:(NSData *)data 47 //{ 48 // NSLog(@"didReceiveData-%@", data); 49 //} 50 /** 51 * 4.服务器的响应数据接收完毕 52 */ 53 - (void)requestFinished:(ASIHTTPRequest *)request 54 { 55 NSLog(@"requestFinished--%@", [request responseData]); 56 } 57 /** 58 * 5.请求失败 59 */ 60 - (void)requestFailed:(ASIHTTPRequest *)request 61 { 62 NSLog(@"requestFailed"); 63 } 64 65 66 /** 67 * 同步的GET请求 68 */ 69 - (void)synGet 70 { 71 // 1.URL 72 NSURL *url = [NSURL URLWithString:@"http://localhost:8080/MJServer/video"]; 73 74 // 2.创建一个请求对象 75 ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 76 request.timeOutSeconds = 15; // 15秒后服务器还没有响应,就算超时 77 78 // 3.开始请求(这行代码会卡主,等待服务器给数据) 79 [request startSynchronous]; 80 81 // 4.请求完毕 82 NSError *error = [request error]; 83 if (error) { 84 NSLog(@"请求失败---%@", error); 85 } else { 86 NSData *data = [request responseData]; 87 // NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 88 // NSString *str = [request responseString]; 89 90 NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil]; 91 NSLog(@"请求成功---%@", dict); 92 } 93 }
POST
1 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 2 { 3 // 1.URL 4 NSURL *url = [NSURL URLWithString:@"http://localhost:8080/MJServer/login"]; 5 6 // 2.创建一个请求对象 7 ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url]; 8 9 // 3.设置请求参数(建议使用setPostValue多一点) 10 [request setPostValue:@"123" forKey:@"username"]; 11 [request setPostValue:@"123" forKey:@"pwd"]; 12 13 // 4.开始请求 14 [request startAsynchronous]; 15 16 // 5.设置监听方法 17 __weak typeof(request) weakRequest = request; 18 [request setCompletionBlock:^{ 19 NSLog(@"请求完毕--%@", [weakRequest responseString]); 20 }]; 21 }
二:其他使用与请求
1 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 2 { 3 // 1.URL 4 NSURL *url = [NSURL URLWithString:@"http://localhost:8080/MJServer/video"]; 5 6 // 2.创建一个请求对象 7 ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 8 9 // 3.开始请求 10 [request startAsynchronous]; 11 12 // 4.设置监听方法 13 request.delegate = self; 14 [request setDidStartSelector:@selector(start:)]; 15 [request setDidFinishSelector:@selector(finish:)]; 16 } 17 18 - (void)start:(ASIHTTPRequest *)request 19 { 20 NSLog(@"start--%@", request); 21 } 22 23 - (void)finish:(ASIHTTPRequest *)request { 24 NSLog(@"finish--%d %@ %@", [request responseStatusCode], [request responseStatusMessage], [request responseData]); 25 } 26 27 - (void)asyncBlock 28 { 29 // 1.URL 30 NSURL *url = [NSURL URLWithString:@"http://localhost:8080/MJServer/video"]; 31 32 // 2.创建一个请求对象 33 ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 34 35 // 如果同时设置了block和实现了代理方法,请求过程中,block和代理方法都会调用, 36 // 一般的调用顺序:代理方法 > block 37 // request.delegate = self; 38 39 // 3.开始请求 40 [request startAsynchronous]; 41 42 // 4.设置block监听 43 [request setStartedBlock:^{ 44 NSLog(@"setStartedBlock"); 45 }]; 46 [request setHeadersReceivedBlock:^(NSDictionary *responseHeaders) { 47 NSLog(@"setHeadersReceivedBlock--%@", responseHeaders); 48 }]; 49 [request setDataReceivedBlock:^(NSData *data) { 50 NSLog(@"setDataReceivedBlock--%@", data); 51 52 }]; 53 [request setCompletionBlock:^{ 54 NSLog(@"setCompletionBlock"); 55 }]; 56 [request setFailedBlock:^{ 57 NSLog(@"setFailedBlock"); 58 }]; 59 } 60 61 //- (void)request:(ASIHTTPRequest *)request didReceiveData:(NSData *)data 62 //{ 63 // NSLog(@"didReceiveData--%@", data); 64 //} 65 // 66 //- (void)requestFinished:(ASIHTTPRequest *)request 67 //{ 68 // NSLog(@"requestFinished"); 69 //}
三:下载
1 - (void)download 2 { 3 if (self.downloading) { 4 [self.request clearDelegatesAndCancel]; 5 6 self.downloading = NO; 7 } else { 8 // 1.URL 9 NSURL *url = [NSURL URLWithString:@"http://localhost:8080/MJServer/resources/test.mp4"]; 10 11 // 2.创建一个请求对象 12 ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 13 14 // 3.设置文件的缓存路径 15 NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]; 16 NSString *filepath = [caches stringByAppendingPathComponent:@"test.mp4"]; 17 request.downloadDestinationPath = filepath; 18 19 // 4.设置进度监听的代理(要想成为进度监听代理,最好遵守ASIProgressDelegate协议) 20 request.downloadProgressDelegate = self.progressView; 21 22 // 这个属性设置为YES,就会支持断点下载 23 request.allowResumeForFileDownloads = YES; 24 25 // 如果要实现断点续传,需要设置一个文件的临时路径 26 request.temporaryFileDownloadPath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"test.temp"]; 27 28 // 5.开始请求 29 [request startAsynchronous]; 30 self.request = request; 31 32 self.downloading = YES; 33 } 34 } 35 36 //- (void)setProgress:(float)newProgress 37 //{ 38 //// NSLog(@"下载进度--%f", newProgress); 39 // self.progressView.progress = newProgress; 40 //}
四:上传
1 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 2 { 3 // 1.URL 4 NSURL *url = [NSURL URLWithString:@"http://localhost:8080/MJServer/upload"]; 5 6 // 2.创建一个请求对象 7 ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url]; 8 9 // 3.设置请求参数 10 [request setPostValue:@"zhangsan" forKey:@"username"]; 11 [request setPostValue:@"123" forKey:@"pwd"]; 12 [request setPostValue:@"28" forKey:@"age"]; 13 [request setPostValue:@"1.89" forKey:@"height"]; 14 15 // 设置文件参数 16 NSString *file = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"mp4"]; 17 // 如果知道文件路径,最好就用这个方法(因为简单) 18 // ASI内部会自动识别文件的MIMEType 19 [request setFile:file forKey:@"file"]; 20 // [request setFile:file withFileName:@"basic.pptx" andContentType:@"application/vnd.openxmlformats-officedocument.presentationml.presentation" forKey:@"file"]; 21 22 // 如果文件数据是动态产生的,就用这个方法(比如刚拍照完获得的图片数据) 23 // [request setData:<#(id)#> withFileName:<#(NSString *)#> andContentType:<#(NSString *)#> forKey:<#(NSString *)#>]; 24 25 // 4.设置监听上传进度的代理 26 request.uploadProgressDelegate = self.progressView; 27 28 // 5.开始请求 29 [request startAsynchronous]; 30 31 // 6.监听完毕 32 __weak typeof(request) weakRequest = request; 33 [request setCompletionBlock:^{ 34 NSLog(@"%@", [weakRequest responseString]); 35 }]; 36 }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。