ASIHTTPRequest是一个HTTP开源项目,提供简单的接口完成复杂的功能,如异步请求,队列请求,GZIP压缩,缓存,断电续传,进度跟踪,上传文件,HTTP认证等。
环境配置比较简单
1,下载解压,拷贝Classes文件夹到自己的项目目录下(Classes文件夹下只保留文件,子文件夹删除)
2,如果是控制台程序,只需要添加最简单的五个库即可(如下图所示),如果是窗体程序记得添加其他必要的库吧。
我下面做几组测试分别试试同步请求,异步请求,表单提交,文件下载等几个简单功能
A,首先创建一个同步请求(获取百度首页的内容并打印出来)
#import <Foundation/Foundation.h> #import "Classes/ASIHTTPRequest.h" int main (int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"]; //同步请求 ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; [request startSynchronous]; NSError *error = [request error]; if(!error){ NSString *response = [request responseString]; NSLog(@"Ret= %@",response); } [pool drain]; return 0; }
代码很简单吧,一点不比Java或者C#这些高级语言复杂
B,创建一个异步请求(异步回调没有设置成功,不知为何)
#import <Foundation/Foundation.h> #import "Classes/ASIHTTPRequest.h" //获取请求结果 void requestFin(ASIHTTPRequest *req) { //获取文本数据 NSString *response = [req responseString]; //获取二进制数据 //NSData *response = [req responseData] NSLog(@"Ret= %@",response); } //获取错误缘故 void requestErr(ASIHTTPRequest *req) { //请求失败,输出错误信息 NSError *err = [req error]; NSLog(@"Err= %@",err); } int main (int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"]; //异步请求 ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; //自定义一个“线程池” NSOperationQueue *nq = [[[NSOperationQueue alloc] init] autorelease]; /* * 此处设置两个回调函数没起作用,不知是不是因为控制台程序的缘故 */ [request setDidFinishSelector:@selector(requestFin)]; [request setDidFailSelector:@selector(requestErr)]; //添加请求操作 [nq addOperation:request]; //可以通过获取事物队列做一些依赖关系的队列 //ASIHTTPRequest *lastR = [[nq operations] lastObject]; requestFin(request);//此处输出null,因为是异步的缘故,请求还没完成 NSLog(@"do other work takes 3 seconds\n"); [NSThread sleepForTimeInterval:3]; requestFin(request);//此处输出请求的返回结果,本应通过回调此接口的,不知为何没设置成功??? [pool drain]; return 0; }或者直接调用startAsync方法,ASI会使用程序默认的“线程池”(不知怎么翻译这个词)
int main (int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"]; //异步请求 ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; [request startAsynchronous]; requestFin(request);//此处输出null,因为是异步的缘故,请求还没完成 NSLog(@"do other work takes 3 seconds\n"); [NSThread sleepForTimeInterval:3]; requestFin(request);//此处输出请求的返回结果,本应通过回调此接口的,不知为何没设置成功??? [pool drain]; return 0; }有的平台支持setCompletionBlock方法,能够更加方便地设置回调内容。
#import <Foundation/Foundation.h> #import "Classes/ASIFormDataRequest.h" int main (int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; NSURL *url = [NSURL URLWithString:@"http://127.0.0.1/index.php"]; //使用表单交互类 ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url]; //设置提交表单 [request setPostValue:@"penjin" forKey:@"name"]; //添加请求头 [request addRequestHeader:@"MyName" value:@"penjin"]; //设置上传文件 [request setFile: @"/Users/penjin/Desktop/data.png" forKey:@"up"]; [request startSynchronous]; NSError *err = [request error]; if (!err) { NSString *res = [request responseString]; NSLog(@"%@",res); } [pool drain]; return 0; }服务器端index.php文件内容
<?php $name = isset($_POST["name"])?$_POST["name"]:"ciaos"; echo "\nHello $name"."\n\n"; echo "Upload\n"; if(isset($_FILES["up"])) { $uploads = $_FILES["up"]; foreach($uploads as $k => $v) { echo "$k = $v"."\n"; } } echo "Header\n"; //only works for apache $headers = getallheaders(); foreach($headers as $k => $v) { echo "$k = $v"."\n"; } ?>运行程序结果如下,可以看出服务器端已经接受到表单上传文件,以及表单提交信息和添加的头信息
Hello penjin //设置的POST表单内容 Upload //上传文件信息 name = data.png type = image/png tmp_name = /private/var/tmp/phpV1ofrZ error = 0 size = 29239 Header Host = 127.0.0.1 User-Agent = (null) (Macintosh; Mac OS X 10.7.4; zh_CN) Content-Length = 29557 Accept-Encoding = gzip MyName = penjin //我们添加的头信息 Content-Type = multipart/form-data; charset=utf-8; boundary=0xKhTmLbOuNdArY-8FB02C13-A2DA-4C41-9107-A4B83D08C9D0 Connection = close
D,下载文件
如果目标文件是一个大文件,我们完全没有必要把内容放在内存中(等待下载完毕后写磁盘),更好的办法是指定一个存储副本,这样ASIHTTPRequest不会占用太多内存。
首先下载内容会被存放在一个临时目录,等待下载完毕后移动到我们设定的目标位置处,如下面代码所示。
#import <Foundation/Foundation.h> #import "Classes/ASIHTTPRequest.h" int main (int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; NSLog(@"start downloading\n"); NSURL *url = [NSURL URLWithString:@"http://127.0.0.1/Lua.pdf"]; ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; [request setDownloadDestinationPath:@"./Lua.pdf"]; [request startSynchronous]; NSLog(@"file downloaded\n"); [pool drain]; return 0; }E,ASIHTTPRequest提供接口获取响应头,响应状态码,控制响应内容的编码方式,还能针对302,301等状态码设置是否自动跳转等。
此外,还提供上传下载的进度回调接口,提供HTTP认证方式访问的接口,设置下载缓存等强大的内容,具体使用方法可以参照官方说明文档。