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方法,能够更加方便地设置回调内容。
C,提交post请求,需要用到ASIFormDataRequest类
#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认证方式访问的接口,设置下载缓存等强大的内容,具体使用方法可以参照官方说明文档。