ASIHTTPRequest使用简介

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认证方式访问的接口,设置下载缓存等强大的内容,具体使用方法可以参照官方说明文档

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值