注册

一个围绕 CFNetwork API的网络通讯库,断点续传神器!

ASIHTTPRequest 是一个围绕 CFNetwork API的易于使用的包装器,它使与 Web 服务器通信的一些更乏味的方面变得更容易。它是用 Objective-C 编写的,适用于 Mac OS X 和 iPhone 应用程序。

它适用于执行基本的HTTP请求并与基于REST的服务(GET / POST / PUT / DELETE交互包含的 ASIFormDataRequest 子类使得使用 multipart/form-data提交POST数据和文件变得容易

它提供:

  • 一个简单的界面,用于向网络服务器提交数据和从网络服务器获取数据
  • 将数据下载到内存或直接下载到磁盘上的文件
  • 在本地驱动器上提交文件作为POST数据的一部分,与HTML文件输入机制兼容
  • 将请求正文直接从磁盘传输到服务器,以节省内存
  • 恢复部分下载
  • 轻松访问请求和响应HTTP标头
  • 进度委托(NSProgressIndicators 和 UIProgressViews)显示有关下载上传进度的信息
  • 操作队列上传下载进度指示器的自动魔法管理
  • 基本、摘要 + NTLM身份验证支持,凭据在会话期间自动重复使用,并且可以存储在钥匙串中以备日后使用。
  • 饼干支持
  • []当您的应用程序移至后台时,请求可以继续运行(iOS 4+)
  • GZIP支持响应数据请求正文
  • 包含的 ASIDownloadCache 类允许请求透明地缓存响应,并且即使在没有可用网络的情况下也允许对缓存数据的请求成功
  • [] ASIWebPageRequest – 下载完整的网页,包括图像和样式表等外部资源。即使没有网络连接,任何大小的页面都可以无限期地缓存,并显示在 UIWebview/WebView 中。
  • 易于使用的 Amazon S3 支持 – 无需自己动手签署请求!
  • 完全支持 Rackspace 云文件
  • []客户端证书支持
  • 支持手动和自动检测代理、验证代理和PAC文件自动配置。内置的登录对话框让您的 iPhone 应用程序可以透明地使用身份验证代理,无需任何额外工作。
  • 带宽限制支持
  • 支持持久连接
  • 支持同步和异步请求
  • 通过委托或 [ NEW ] 块获取有关请求状态更改的通知(Mac OS X 10.6、iOS 4 及更高版本)
  • 带有广泛的单元测试

ASIHTTPRequest 兼容 Mac OS 10.5 或更高版本,以及 iOS 3.0 或更高版本。


创建同步请求

使用 ASIHTTPRequest 的最简单方法。发送startSynchronous 消息将在同一线程中执行请求,并在完成(成功或失败)时返回控制权。

通过检查error属性来检查问题

要以字符串形式获取响应,请调用responseString方法。不要将它用于二进制数据 - 使用responseData获取 NSData 对象,或者,对于较大的文件,将您的请求设置为使用downloadDestinationPath属性下载到文件

- (IBAction)grabURL:(id)sender
{
NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request startSynchronous];
NSError *error = [request error];
if (!error) {
NSString *response = [request responseString];
}
}

与前面的示例执行相同的操作,但请求在后台运行。

- (IBAction)grabURLInBackground:(id)sender
{
NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDelegate:self];
[request startAsynchronous];
}
 
- (void)requestFinished:(ASIHTTPRequest *)request
{
// Use when fetching text data
NSString *responseString = [request responseString];
 
// Use when fetching binary data
NSData *responseData = [request responseData];
}
 
- (void)requestFailed:(ASIHTTPRequest *)request
{
NSError *error = [request error];
}

请注意,我们设置了请求的委托属性,以便我们可以在请求完成或失败时收到通知。

这是创建异步请求的最简单方法,它将在后台运行在全局 NSOperationQueue 中。对于更复杂的操作(例如跟踪多个请求的进度),您可能希望创建自己的队列,这就是我们接下来将介绍的内容。

使用块

从 v1.8 开始,我们可以在支持块的平台上使用块来做同样的事情:

- (IBAction)grabURLInBackground:(id)sender
{
NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
__block ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setCompletionBlock:^{
// Use when fetching text data
NSString *responseString = [request responseString];
 
// Use when fetching binary data
NSData *responseData = [request responseData];
}];
[request setFailedBlock:^{
NSError *error = [request error];
}];
[request startAsynchronous];
}

请注意在我们声明请求时使用__block限定符,这很重要!它告诉块不要保留请求,这对于防止保留循环很重要,因为请求将始终保留块。

使用队列

这个例子再次做同样的事情,但我们为我们的请求创建了一个 NSOperationQueue。

使用您自己创建的 NSOperationQueue(或 ASINetworkQueue,见下文)可以让您更好地控制异步请求。使用队列时,只能同时运行一定数量的请求。如果您添加的请求多于队列的maxConcurrentOperationCount属性,则请求将在开始之前等待其他人完成。

- (IBAction)grabURLInTheBackground:(id)sender
{
if (![self queue]) {
[self setQueue:[[[NSOperationQueue alloc] init] autorelease]];
}
 
NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDelegate:self];
[request setDidFinishSelector:@selector(requestDone:)];
[request setDidFailSelector:@selector(requestWentWrong:)];
[[self queue] addOperation:request]; //queue is an NSOperationQueue
}
 
- (void)requestDone:(ASIHTTPRequest *)request
{
NSString *response = [request responseString];
}
 
- (void)requestWentWrong:(ASIHTTPRequest *)request
{
NSError *error = [request error];
}


demo及常见问题:https://github.com/paytronix/ASIHTTPRequest

源码下载:ASIHTTPRequest-master.zip


0 个评论

要回复文章请先登录注册