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 }
时间: 2024-08-04 03:43:09

iOS开发——网络编程OC篇&(十一)ASI了解的相关文章

iOS开发——网络编程OC篇&amp;(三)数据请求

一.GET请求和POST请求简单说明 创建GET请求 1 // 1.设置请求路径 2 NSString *urlStr=[NSString stringWithFormat:@"http://192.168.1.53:8080/MJServer/login?username=%@&pwd=%@",self.username.text,self.pwd.text]; 3 NSURL *url=[NSURL URLWithString:urlStr]; 4 5 // 2.创建请求对

iOS开发——网络编程OC篇&amp;(九)数据解析

数据解析 关于iOS开发的中数据解析的方法有两种JSON和XML,这里只做简单的介绍,会使用就可以了. JSON—— 关于JSON的解析经过很多爱好者的分析使用相同自带的还是最好的,不管是从使用的容易度还是性能方面 NSJSONSerialization 1 -(void)start 2 { 3 4 NSString* path = [[NSBundle mainBundle] pathForResource:@"Notes" ofType:@"json"]; 5

iOS开发——网络编程OC篇&amp;总结

网络开发总结 一.一个HTTP请求的基本要素 1.请求URL:客户端通过哪个路径找到服务器 2.请求参数:客户端发送给服务器的数据 * 比如登录时需要发送的用户名和密码 3.返回结果:服务器返回给客户端的数据 * 一般是JSON数据或者XML数据 二.基本的HTTP请求的步骤(移动客户端)1.拼接"请求URL" + "?" + "请求参数" * 请求参数的格式:参数名=参数值 * 多个请求参数之间用&隔开:参数名1=参数值1&参数

iOS开发——网络编程OC篇&amp;Socket编程

Socket编程 一.网络各个协议:TCP/IP.SOCKET.HTTP等 网络七层由下往上分别为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. 其中物理层.数据链路层和网络层通常被称作媒体层,是网络工程师所研究的对象: 传输层.会话层.表示层和应用层则被称作主机层,是用户所面向和关心的内容. http协议   对应于应用层 tcp协议    对应于传输层 ip协议     对应于网络层 三者本质上没有可比性.  何况HTTP协议是基于TCP连接的. TCP/IP是传输层协议,主要

iOS开发——网络编程OC篇&amp;(十二)AFN详解

AFN详解 众所周知,苹果搞的一套框架NSContention发送请求与接收请求的方式十分繁琐.操作起来很不方便.不仅要做区分各种请求设置各种不同的参数,而且还要经常在多线程里操作,同时还要对请求与返回的数据做各种序列化的操作,同时还要考虑请求数据的安全等一堆问题. 一.早前的几个网络框架 1.ASI框架: HTTP终结者.很牛, 但是有BUG, 已经停止更新. 2.MKNetworkKit (印度人写的). 3.AFN一直还在更新. AFNetworking的出现:MAC/iOS设计的一套网络

iOS开发——网络编程OC篇&amp;(十)NSURLConnection/NSSeccession

一.NSURLConnection的常用类 (1)NSURL:请求地址 (2)NSURLRequest:封装一个请求,保存发给服务器的全部数据,包括一个NSURL对象,请求方法.请求头.请求体.... (3)NSMutableURLRequest:NSURLRequest的子类 (4)NSURLConnection:负责发送请求,建立客户端和服务器的连接.发送NSURLRequest的数据给服务器,并收集来自服务器的响应数据 二.NSURLConnection的使用 1.简单说明 使用NSURL

iOS开发——网络编程OC篇&amp;(一)XMPP简单介绍与准备

XMPP简单介绍与准备 一.即时通讯简单介绍 1.简单说明 即时通讯技术(IM)支持用户在线实时交谈.如果要发送一条信息,用户需要打开一个小窗口,以便让用户及其朋友在其中输入信息并让交谈双方都看到交谈的内容. 有许多的IM系统,如AOL IM.Yahoo IM. MSN以及QQ,它们最大的区别在于各自通讯协议的实现,所以即时通讯技术的核心在于它的传输协议. 协议用来说明信息在网络上如何传输,如果有了统一的传输协议,那么应当可以实现各个IM之间的直接通讯,为了创建即时通讯的统一标准,目前已经出现过

iOS开发——网络编程OC篇&amp;使用WebView构建HyBird应用

使用WebView构建HyBird应用 HyBird是一种本地技术与Web相结合,能过实现跨平台的移动应用开发,最常用的一个框架:PhoneGap 一:首先,写好html代码 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0, m

iOS开发——网络编程OC篇&amp;(五)网络监控

网络监控 随着移动网络升级:2G->3G->4G甚至相传正在研发的5G,网络速度是越来越快,但这流量也像流水一般哗哗的溜走. 网上不是流传一个段子: 睡觉忘记关流量,第二天房子就归移动了! 这固然是一种夸张的说法,但是作为一个优秀的App开发人员,我们需要在App中给出最恰当的提示. 在需要花费大量流量的时候(例如:视频,下载等)给出一些提示. 在用户视频期间用户切换网络的时候给出是否继续观看的提示! 下面笔者就给出一种可以实时监控网络状态改变的方法! 笔者使用的是网络流传最广的网络监控类:R