使用iOS SDK中的HTTP网络请求API,相当的复杂,调用比较麻烦,ASIHTTPRequest 对CFNetwork API进行了封装,并且使用起来非常简单的一套API,在很多比较老旧的项目依然存在,因此大家仍然需要熟悉ASI的使用。下面我们一起学习研究一下ASI的简单使用。
一、环境搭建 |
1、首先下载asi包,并且引入下面文件:http://allseeing-i.com/ASIHTTPRequest/
2、增加框架
二、使用方法 |
1、发送同步GET请求,直接调用startSynchronous方法即可,下面的服务地址自己可以自己搭建,发送请求后调用请求的responseData属性便获取到返回的数据:
- (void)sync{ NSURL *url=[NSURL URLWithString:@"http://192.168.2.162/logo.php?userName=jereh&pwd=123"]; ASIHTTPRequest * requst=[[ASIHTTPRequest alloc] initWithURL:url]; //设置超时时间 requst.timeOutSeconds=3; //发送同步请求 [requst startSynchronous]; if(requst.error){ NSLog(@"请求出错了,%@",requst.error); }else { NSData * data=requst.responseData; NSDictionary * dic=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil]; NSLog(@"%@",dic); } }
2、发送异步GET请求,直接调用startAsynchronous方法即可,异步和同步稍有不同,使用代理接受数据
- (void)async{ dataResult=[NSMutableData data]; NSURL *url=[NSURL URLWithString:@"http://192.168.2.162/logo.php?userName=jereh&pwd=123"]; ASIHTTPRequest * requst=[[ASIHTTPRequest alloc] initWithURL:url]; self.request=requst; requst.timeOutSeconds=3; requst.delegate=self; [requst startAsynchronous]; } //开始发送请求 - (void)requestStarted:(ASIHTTPRequest *)request{ } //失败的时候调用 - (void)requestFailed:(ASIHTTPRequest *)request{ NSLog(@"===requestFailed"); } //接收数据调用,如果文件过大分多次调用,此处需要拼接返回的data - (void)request:(ASIHTTPRequest *)request didReceiveData:(NSData *)data{ [dataResult appendData:data]; } //请求结束后解析数据 - (void)requestFinished:(ASIHTTPRequest *)request{ NSDictionary * dic=[NSJSONSerialization JSONObjectWithData:dataResult options:NSJSONReadingMutableContainers error:nil]; }
3、使用块来实现异步GET请求,因为当面对多个请求的时候采用代理的方式稍微显得有点麻烦,比如在拼接数据的时候需要判断当前是哪个请求,然后根据请求对象地址来确定采取哪种拼接,所以,在处理多个请求的时候用块比较有优势
- (void) asyncFormBlock{ NSURL *url=[NSURL URLWithString:@"http://192.168.2.162/loginPost.php"]; ASIFormDataRequest * request=[ASIFormDataRequest requestWithURL:url]; //设置请求参数 [request setPostValue:@"jereh" forKey:@"userName"]; [request setPostValue:@"123" forKey:@"pwd"]; [request startAsynchronous]; //请求完成后解析数据 [request setCompletionBlock:^{ NSDictionary * dic=[NSJSONSerialization JSONObjectWithData:dataResult options:NSJSONReadingMutableContainers error:nil]; NSLog(@"%@",dic); }]; //开始接收的时候调用 [request setDataReceivedBlock:^(NSData *data) { [dataResult appendData:data]; }]; //失败的时候调用 [request setFailedBlock:^{ }]; }
4、同步Post请求的实现,Post请求和get不同,这里需要拼接条件,而且这次用到的类也稍微不同ASIFormDataRequest,除此之外基本类似。代码如下:
ASIFormDataRequest * request=[ASIFormDataRequest requestWithURL:url]; //设置请求参数 [request setPostValue:@"jereh" forKey:@"userName"]; [request setPostValue:@"123" forKey:@"pwd"]; request.timeOutSeconds=3; [request startSynchronous];
5、异步的Post请求我就不用说了吧?相信大家能写出来
6、下载,在涉及到网络的时候必然涉及到网络的下载和上传,ASI对文件的下载封装的非常好,我们用起来非常的简单,下面我们通过一个进度条显示下载进度,效果图如下:
- (void)asyncDowload{ NSURL * url=[NSURL URLWithString:@"http://192.168.1.107/test.rar"]; ASIHTTPRequest * request=[ASIHTTPRequest requestWithURL:url]; NSString * path=[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]; path=[path stringByAppendingPathComponent:@"test.rar"]; //设置下载路径 request.downloadDestinationPath=path; //支持断点续传 request.allowResumeForFileDownloads=YES; //设置下载代理,将代理设置为progress对象即可 request.downloadProgressDelegate=circle; [request startAsynchronous]; }
7、文件的上传和下载类似,但是需要注意的事情是,上传需要往服务器发送东西,既然需要向服务器传递东西就涉及到POST,用get的方式是直接获取的,没法传值因此,上传需要用到类ASIFormDataRequest,操作和上面讲到的Post提交类似,不过这里注意的是,既然需要传递东西,就要调用传递东西的方法即可。在这里我们有三个方法
1 直接设置文件,其他默认
[request setFile:path forKey:@"file"];
2 设置文件,同时设置目的文件名称和类型
[request setFile:path withFileName:@"asiImg1.png" andContentType:@"image/png" forKey:@"file"];
3 设置二进制文件,同时设置目的文件名称和类型
[request setData:data withFileName:@"t.png" andContentType:@"image/png" forKey:@"file"];
想要了解更多内容的小伙伴,可以点击查看源码,亲自运行测试。
疑问咨询或技术交流,请加入官方QQ群: (452379712)
作者:杰瑞教育
出处:http://www.cnblogs.com/jerehedu/
本文版权归烟台杰瑞教育科技有限公司和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。