您的位置:首页 > 理论基础 > 计算机网络

ASIHTTPRequest

2015-07-23 13:59 531 查看

下载ASIHTTPRequest:

下载地址如下所示!

下载最新版本:http://github.com/pokeb/asi-http-request/tarball/master
License (BSD):http://github.com/pokeb/asi-http-request/tree/master/LICENSE
Google Group:http://groups.google.com/group/asihttprequest
Lighthouse bug base::http://allseeing-i.lighthouseapp.com/projects/27881/home

ASIHTTPRequest是什么?

使用iOS SDK中的HTTP网络请求API,相当的复杂,调用很繁琐,ASIHTTPRequest就是一个对CFNetwork API进行了封装,并且使用起来非常简单的一套API,用Objective-C编写,可以很好的应用在Mac OS X系统和iOS平台的应用程序中。ASIHTTPRequest适用于基本的HTTP请求,和基于REST的服务之间的交互。

特性

l 通过简单的接口,即可完成向服务端提交数据和从服务端获取数据的工作
l 下载的数据,可存储到内存中或直接存储到磁盘中
l 能上传本地文件到服务端
l 可以方便的访问和操作请求和返回的Http头信息
l 可以获取到上传或下载的进度信息,为应用程序提供更好的体验
l 支持上传或下载队列,并且可获取队列的进度信息
l 支持基本、摘要和NTLM身份认证,在同一会话中授权凭证会自动维持,并且可以存储在Keychain(Mac和iOS操作系统的密码管理系统)中
l 支持Cookie
l 当应用(iOS 4+)在后台运行时,请求可以继续运行
l 支持GZIP压缩数据
l 内置的ASIDownloadCache类,可以缓存请求返回的数据,这样即使没有网络也可以返回已经缓存的数据结果
l ASIWebPageRequest –可以下载完整的网页,包括包含的网页、样式表、脚本等资源文件,并显示在UIWebView /WebView中。任意大小的页面都可以无限期缓存,这样即使没有网络也可以离线浏览
l 支持客户端证书
l 支持通过代理发起Http请求
l 支持带宽限制。在iOS平台,可以根据当前网络情况来自动决定是否限制带宽,例如当使用WWAN(GPRS/Edge/3G)网络时限制,而当使用WIFI时不做任何限制
l 支持断点续传
l 支持同步和异步请求

类的概述

主要类



ASIHTTPRequest

网路通信的基本处理,包括下载和上传数据、身份验证、cookies 和 progress跟踪。



ASIFormDataRequest

ASIHTTPRequest的一个子类,处理x-www-form-urlencoded和多部分/格式数据的帖子。
它使发布的数据和文件很容易,但是你不需要添加这个项目如果你想管理POST数据自己或不需要POST数据。



ASINetworkQueue

NSOperationQueue的一个子类可以跨多个请求跟踪进度。 你不需要这个,如果你只需要执行一个请求,或倾向于单独的进步跟踪每个请求。



ASIDownloadCache

这个类允许ASIHTTPRequest透明地从网络服务器缓存响应。 请求可以被配置为使用缓存的内容当远程数据尚未更新自上次下载,当网络可用,或者每当缓存的数据是可用的。

如果您不希望使用缓存,或编写自己的缓存,您不需要包含这个类。

支持类

你不会一般需要直接使用这些类,它们是在幕后使用上面的主要类。



ASIInputStream

上传数据时所使用的一个助手类ASIHTTPRequest。 你必须使用ASIHTTPRequest这个类包含在您的项目。



ASIDataDecompressor

使用的助手类ASIHTTPRequest膨胀(减压)gzip内容。 你必须使用ASIHTTPRequest这个类包含在您的项目。



ASIDataCompressor

一个助手类ASIHTTPRequest用来缩小(压缩)的内容。 你必须使用ASIHTTPRequest这个类包含在您的项目。



ASIAuthenticationDialog

这个类允许ASIHTTPRequest呈现一个登录对话框时需要身份验证的连接到网络服务器,和身份验证代理。 应在所有项目针对iPhone操作系统,虽然不是Mac OS项目。



Reachability

这个类是由安德鲁Donoho作为一个替代苹果的可达性类
它允许ASIHTTPRequest通知当网络连接从WWAN变为WiFi,反之亦然。 你必须包括在iPhone这类项目,但不是在Mac的项目。

你会发现这个类用于检测网络可用性的状态——在您自己的应用程序了解更多

协议和配置

你必须包括所有的这些文件在您的项目。



ASIHTTPRequestDelegate

该协议指定代表一个ASIHTTPRequest可能实现的方法。 所有这些方法都是可选的。



ASIProgressDelegate

这个协议列出了一个uploadProgressDelegate或downloadProgressDelegate可能实现的方法。 所有这些方法都是可选的。



ASICacheDelegate

该协议用于指定下载缓存必须实现的方法。 如果你想写自己的下载缓存,确保它实现所需的方法在本议定书。



ASIHTTPRequestConfig.h

这个文件定义全局配置选项设置在编译时。 使用这个文件中的选项打开各种调试选项,打印信息请求做什么到控制台。别忘了关掉这些在船舶应用程序!

在iOS使用ASIHTTPRequest项目

1)添加文件

复制文件你需要你的项目文件夹,并将它们添加到您的Xcode项目。 出现的概述ASIHTTPRequest源文件在这里

如果你不确定你需要哪些文件,最好是复制所有下列文件:

ASIHTTPRequestConfig.h
ASIHTTPRequestDelegate.h
ASIProgressDelegate.h
ASICacheDelegate.h
ASIHTTPRequest.h
ASIHTTPRequest.m
ASIDataCompressor.h
ASIDataCompressor.m
ASIDataDecompressor.h
ASIDataDecompressor.m
ASIFormDataRequest.h
ASIInputStream.h
ASIInputStream.m
ASIFormDataRequest.m
ASINetworkQueue.h
ASINetworkQueue.m
ASIDownloadCache.h
ASIDownloadCache.m

iPhone项目还必须包括:

ASIAuthenticationDialog.h
ASIAuthenticationDialog.m
可达性。 h(在外部/可达性文件夹)
可达性。 在外部/米(可达性文件夹)

2)与CFNetwork SystemConfiguration,MobileCoreServices,CoreGraphics zlib

打开设置你的目标通过点击蓝色栏顶端的Xcode栏:



打开构建阶段选项卡,扩大盒标签二进制与库链接然后单击+按钮。



选择CFNetwork.framework从列表中,并单击添加:



重复最后两个步骤,添加以下:SystemConfiguration.framework,MobileCoreServices.framework,CoreGraphics.framework和libz.dylib。

在Mac OS X中使用ASIHTTPRequest项目

在Mac使用ASIHTTPRequest项目,你需要链接对:

SystemConfiguration。 框架+ zlib(如上所述)
CoreServices.framework

CFNetwork CoreServices框架的一部分是在Mac OS x上,除非你正在编写一个基于控制台的应用程序,应用程序可能已经与CoreServices设置链接,但如果不是,只是添加CoreServices。 框架在上面描述的一样。

构建测试



大多数用户可以跳过这一部分!

的测试ASIHTTPRequest主要存在对我的好处,所以我可以检查我没有破碎的东西当我做出改变。 你只需要运行测试如果你修改ASIHTTPRequest,或想确认一些按预期工作。

ASIHTTPRequest使用加布里埃尔Handford的美妙的GHUnit框架运行测试。

v1.8-50,GHUnit不再是包括作为一个git子模块。 相反,构建脚本自动下载预编译框架如果在本地不存在。 如果你更愿意建立GHUnit自己,简单从GitHub抓住一个副本,把外部/
GHUnit构建框架。

运行一些测试需要额外的信息:

S3运行测试时,您需要指定您的S3访问细节ASIS3RequestTests.m
代理运行测试时,您需要指定您的代理服务器的细节,和PAC文件如果你想运行PAC测试。 注意,代理测试需要一个代理服务器,而所有其他测试要求你没有代理服务器。

创建和运行要求

创建一个同步请求

最简单的方法使用ASIHTTPRequest。 发送startSynchronous消息将在同一线程中执行请求,并返回控制当它完成了(无论成功与否)。

检查问题通过检查错误财产。

将响应作为字符串,调用responseString连续的不要使用这个二进制数据,使用responseDataNSData对象,或者,对于较大的文件,设置请求下载文件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];
}
}




通常,您应该使用异步请求优先于同步请求。 当你使用ASIHTTPRequest同步从主线程,您的应用程序的用户界面将锁定,无法使用请求的持续时间。

创建一个异步请求

前面的例子一样,但请求在后台运行。

- (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限定符我们申报请求时,这是很重要的!
它讲述了块不保留请求,在防止retain-cycle这一点很重要,因为请求将永远保留。

使用一个队列

这个例子再次做同样的事,但是我们已经创建了一个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];
}

在上面的示例中,“队列”是一个保留NSOperationQueue财产的控制器。

我们设置自定义选择器时,将调用请求成功或失败。 如果你不设置这些默认值(requestFinished:requestFailed:)将被使用,如前面的例子。

处理多个请求的委托方法的成功与失败

如果您需要处理许多不同类型的成功与失败请求,你有几个选择:

如果你的请求都是相同的广泛的类型,但是你想要区分他们,你可以设置用户信息NSDictionary属性的每个请求使用自己的自定义数据,你可以阅读完成/委派方法失败了。
对于简单的情况下,您可以设置请求的标签财产。 这两种属性是供自己使用,而不是发送到服务器。
如果您需要处理成功和失败在一个完全不同的方式为每个请求,设置不同的setDidFinishSelector / setDidFailSelector为每个请求
对于更复杂的情况下,或者你想在后台解析响应,创建一个最小的子类ASIHTTPRequest为每种类型的请求,并覆盖requestFinished:failWithError:



最好避免使用请求的URL来区分不同的请求在你代表的方法,因为当请求重定向URL属性可以改变。 如果你真的想使用请求URL,使用[请求originalURL]——这将永远是第一个URL请求连接。

关于ASINetworkQueues

ASINetworkQueue NSOperationQueue的子类提供了一些额外的功能。

它的主要目的是让你的上传或下载进度跟踪整个队列(阅读更多关于进展跟踪)。

此外,ASINetworkQueues提供一些额外的委托方法选择器:

requestDidStartSelector

称为每次请求队列中开始运行。 您可以使用此作为替代指定didStartSelector和设置一个委托请求你添加到队列中
requestDidReceiveResponseHeadersSelector

称为每次请求队列中接收来自服务器的响应标头。 对于大型下载,这可能是一段时间的请求完成。 您可以使用此作为替代指定didReceiveResponseHeadersSelector和设置一个委托请求你添加到队列中
requestDidFinishSelector

称为每次请求队列中成功完成。 您可以使用此作为替代指定didFinishSelector和设置一个委托请求你添加到队列中
requestDidFailSelector

称为每次请求队列中的失败。 您可以使用此作为替代指定didFailSelector和设置一个委托请求你添加到队列中
queueDidFinishSelector

当整个队列已经完成,是否单个请求失败或成功。

使用这些设置队列的代表(而不是请求的代表)的控制器实现了这些选择器代表的方法。

从NSOperationQueues ASINetworkQueues工作略有不同,请求添加不会立即开始运行。 当使用一个ASINetworkQueue,添加您想要运行的所有操作,然后调用(队列去)
当你开始一个队列准确的进步打开,它将首先执行请求的GET请求队列中获取数据的总大小下载。
一旦总大小,它可以准确地显示总进度,将开始真正的请求。



当你添加一个请求的ASINetworkQueue已经开始了吗?

如果您正在使用一个ASINetworkQueue跟踪多个请求的总体进展,总体进展将向后考虑每一个新请求只有当该请求开始运行。
ASINetworkQueue不会执行一个HEAD请求请求在队列中添加启动,因此,如果您添加许多请求一个运行队列,总体进展不会立即更新。

如果一个队列已经运行,您不需要再次调用(队列去)。

当一个请求在一个ASINetworkQueue失败,队列将默认取消所有其他请求。 你可以禁用这种行为(队列setShouldCancelAllRequestsOnFailure:没有)

ASINetworkQueues只能运行ASIHTTPRequest操作,他们不能用于一般操作。 试图添加一个NSOperation不是ASIHTTPRequest将产生一个异常。



这里有一个完整的示例显示基本的创建和使用一个ASINetworkQueue:

http://gist.github.com/150447

取消异步请求

取消异步请求(请求开始(请求startAsynchronous)或请求运行在您创建一个队列),电话(请求取消)
请注意,您不能取消一个同步请求。

请注意,当您取消一个请求,请求将这视为一个错误,会打电话给你的代表和/或队列的失败代表方法。 如果你不希望这种行为,设置你的委托为零在调用取消之前,或使用clearDelegatesAndCancel方法相反。

// Cancels an asynchronous request
[request cancel]

// Cancels an asynchronous request, clearing all delegates and blocks first
[request clearDelegatesAndCancel];

当使用一个ASINetworkQueue,所有其他请求都将被取消当你取消一个人除非队列的请求shouldCancelAllRequestsOnFailure(是的是默认的)。

// When a request in this queue fails or is cancelled, other requests will continue to run
[queue setShouldCancelAllRequestsOnFailure:NO];

// Cancel all requests in a queue
[queue cancelAllOperations];

安全处理委托请求已经完成了之前被收回

请求不保留他们的代表,所以如果有机会你的代表可能被收回而请求运行时,至关重要的是,你明确的请求的代表属性。 在大多数情况下,如果你的代表将被收回,你可能还想取消请求,因为你不再关心请求的状态。

在下面的示例中,我们的控制器有一个ASIHTTPRequest存储在一个实例变量保留。 我们叫它dealloc clearDelegatesAndCancel方法实现,之前我们发布的要求:

// Ddealloc method for our controller
- (void)dealloc
{
[request clearDelegatesAndCancel];
[request release];
...
[super dealloc];
}

发送数据

设置请求头

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request addRequestHeader:@"Referer" value:@"http://allseeing-i.com/"];

与ASIFormDataRequest发送表单POST

将POST数据的方式兼容web页面的形式,包括使用ASIFormDataRequest子类
数据发布在“应用程序/ x-www-form-urlencoded”格式,或多部分/格式数据的格式上传二进制数据或文件。 根据需要从磁盘读取数据文件,所以上传大文件是好的,只要您的web服务器设置来处理它们。

ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
[request setPostValue:@"Ben" forKey:@"first_name"];
[request setPostValue:@"Copsey" forKey:@"last_name"];
[request setFile:@"/Users/ben/Desktop/ben.jpg" forKey:@"photo"];

ASIFormDataRequest将自动检测文件的mime类型(iOS 3.0或更高版本的Mac)添加到帖子通过setFile:forKey:,包括这个mime头发送到服务器。 如果您喜欢,您可以使用时间越长,形成覆盖:

ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];

// Upload a file on disk
[request setFile:@"/Users/ben/Desktop/ben.jpg" withFileName:@"myphoto.jpg" andContentType:@"image/jpeg"
forKey:@"photo"];

// Upload an NSData instance
[request setData:imageData withFileName:@"myphoto.jpg" andContentType:@"image/jpeg" forKey:@"photo"];

您可以发送多个值相同的参数使用的选择添加API:

ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
[request addPostValue:@"Ben" forKey:@"names"];
[request addPostValue:@"George" forKey:@"names"];
[request addFile:@"/Users/ben/Desktop/ben.jpg" forKey:@"photos"];
[request addData:imageData withFileName:@"george.jpg" andContentType:@"image/jpeg" forKey:@"photos"];

看到ASIFormDataRequest.h为一个完整的列表的所有方法将参数添加到您的帖子。

PUT请求和自定义职位

如果你想通过将发送数据,或者想要发送它的文章,但更喜欢自己创建后的身体,使用appendPostData:或appendPostDataFromFile:。

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request appendPostData:[@"This is my data" dataUsingEncoding:NSUTF8StringEncoding]];
// Default becomes POST when you use appendPostData: / appendPostDataFromFile: / setPostBody:
[request setRequestMethod:@"PUT"];

如果你想发送大量的数据和不使用ASIFormDataRequest,看到流媒体信息发布机构从磁盘在下面。

下载数据

直接下载响应文件

如果你请求的资源是相当大的,你可以节省内存直接通过下载一个文件。 这种方式,ASIHTTPRequest不必保持整个反应在内存中。

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDownloadDestinationPath:@"/Users/ben/Desktop/my_file.txt"];

当下载数据到一个文件中使用downloadDestinationPath数据将被保存在一个临时文件,请求正在进行中。
存储在这个文件的路径temporaryFileDownloadPath。 请求成功完成时,会发生两件事情之一:

如果数据是gzip压缩(见gzip的信息压缩),将未压缩的压缩文件到downloadDestinationPath,临时文件将会被删除
如果数据不压缩,搬到downloadDestinationPath临时文件,覆盖以前的任何文件



注意,如果响应主体是空的,没有文件将被创建。 如果有可能请求会返回一个空的身体,确保你检查文件是否存在在你尝试做任何事。

处理响应数据,因为它的到来

如果你需要处理响应,因为它是在(例如,您想要使用一个流解析器来解析响应虽然仍在下载),委托实施要求:didReceiveData:(见ASIHTTPRequestDelegate.h)。
请注意,当你这样做时,ASIHTTPRequest不会填充responseData或写响应中downloadDestinationPath——你必须存储响应自己如果你需要。

读取HTTP状态代码

ASIHTTPRequest与大多数不做任何特别的HTTP状态码(除了重定向和身份验证状态代码,更多信息见下文),由你来寻找问题(如:404),确保你的行为适当。

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request startSynchronous];
int statusCode = [request responseStatusCode];
NSString *statusMessage = [request responseStatusMessage];

阅读响应标头

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request startSynchronous];
NSString *poweredBy = [[request responseHeaders] objectForKey:@"X-Powered-By"];
NSString *contentType = [[request responseHeaders] objectForKey:@"Content-Type"];

处理文本编码

ASIHTTPRequest将尝试读课文从content - type报头编码接收的数据。 如果找到一个文本编码,它将responseEncoding设置为适当的NSStringEncoding
如果它不能找到一个在标题文本编码,它将使用的价值defaultResponseEncoding NSISOLatin1StringEncoding(违约)。

当您调用请求responseString,ASIHTTPRequest将尝试创建一个字符串从接收到的数据,使用responseEncoding作为源编码。

处理重定向

ASIHTTPRequest将自动重定向到一个新的URL时遇到的一个HTTP状态代码后,假设位置标题发送:

301年搬到永久
302年发现的
303看到其他

在重定向时,响应数据的值(responseHeaders / responseCookies / responseData / responseString等)中反映的内容收到最后的位置。

饼干在期间遇到的任何url重定向循环将存储在全局缓存存储,并将代表在适当的时候重定向请求到服务器。

你可以关掉自动重定向通过设置请求的shouldRedirect没有财产。



默认情况下,自动重定向总是重定向使用GET请求(没有身体)。 这种行为匹配大多数浏览器的工作方式,而不是HTTP规范,指定301和302重定向应该使用原来的方法。

保持原来的方法(包括请求主体)为301和302重定向,集shouldUseRFC2616RedirectBehaviour是的在请求在你开始之前。

跟踪进展

每个ASIHTTPRequest有两个代表,可用于追踪进展——downloadProgressDelegate(下载)和uploadProgressDelegate(上传)。

进步的代表可以NSProgressIndicators(Mac OS X)或UIProgressViews(iPhone)。 ASIHTTPRequest将自动满足这两个类的行为的差异。 如果你愿意,你也可以使用一个自定义的类作为代表进步,只要响应setProgress:。

如果您正在执行一个请求,你设定一个上传或下载的进步代表请求
如果您正在执行多个请求队列,和你想跟踪整体进步的所有请求队列,使用ASINetworkQueue并设置队列的进步代表
如果你想做这两个在同一时间,这是可能的(v0.97)



重要的是:如果你是一个网站,上传需要认证,上传将重置为其进展之前的值每次不能提供有效的身份验证。 为这个原因,建议你只使用一个上传进度代表当useSessionPersistence是肯定的(见下文)当通信与web服务器进行身份验证,并确保你在另一个请求进行身份验证试图追踪的上传大量的数据。



跟踪进步上传请求体小于128 kb的目前是不可能的。 请求大于128 kb,进步进步代表将不会收到信息的第一个128 kb的post数据。 这是由于CFNetwork API的限制。我已经提交了一份功能增强和苹果(错误id
6596016),希望他们将在未来修改CFNetwork使这一切成为可能。

2009年6月21日更新:在苹果的人还是很好的解决我的错误报告! iPhone 3.0 SDK,它看起来像已经减少到32 kb缓冲区的大小,这使得准确上载进度跟踪更可靠。

跟踪下载进度为单个请求

在这个例子中,myProgressIndicator NSProgressIndicator。

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDownloadProgressDelegate:myProgressIndicator];
[request startSynchronous];
NSLog(@"Max: %f, Value: %f", [myProgressIndicator maxValue],[myProgressIndicator doubleValue]);

跟踪下载进度的要求

在这个例子中,myProgressIndicator UIProgressView,myQueue ASINetworkQueue。

- (void)fetchThisURLFiveTimes:(NSURL *)url
{
[myQueue cancelAllOperations];
[myQueue setDownloadProgressDelegate:myProgressIndicator];
[myQueue setDelegate:self];
[myQueue setRequestDidFinishSelector:@selector(queueComplete:)];
int i;
for (i=0; i<5; i++) {
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[myQueue addOperation:request];
}
[myQueue go];
}

- (void)queueComplete:(ASINetworkQueue *)queue
{
NSLog(@"Value: %f", [myProgressIndicator progress]);
}

注意ASINetworkQueues,我们不得不叫myQueue去启动队列。

对单个请求跟踪上传进度

在这个例子中,myProgressIndicator UIProgressView。

ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
[request setPostValue:@"Ben" forKey:@"first_name"];
[request setPostValue:@"Copsey" forKey:@"last_name"];
[request setUploadProgressDelegate:myProgressIndicator];
[request startSynchronous];
NSLog(@"Value: %f",[myProgressIndicator progress]);

一组请求跟踪上传进展

在这个例子中,myProgressIndicator NSProgressIndicator,myQueue ASINetworkQueue。

- (void)uploadSomethingFiveTimes:(NSURL *)url
{
[myQueue cancelAllOperations];
[myQueue setUploadProgressDelegate:myProgressIndicator];
[myQueue setDelegate:self];
[myQueue setRequestDidFinishSelector:@selector(queueComplete:)];
int i;
for (i=0; i<5; i++) {
ASIHTTPRequest *request = [ASIFormDataRequest requestWithURL:url];
[request setPostBody:[@"Some data" dataUsingEncoding:NSUTF8StringEncoding]];
[myQueue addOperation:request];
}
[myQueue go];
}

- (void)queueComplete:(ASINetworkQueue *)queue
{
NSLog(@"Max: %f, Value: %f", [myProgressIndicator maxValue],[myProgressIndicator doubleValue]);
}

准确的进度和简单的进度

ASIHTTPRequest提供了两种方法显示进展,简单的进步,和准确的进步。 他们利用ASIHTTPRequests showAccurateProgress和ASINetworkQueues控制。 当你设置showAccurateProgress请求时,它只影响该请求。 当你把它放在一个队列,它影响所有请求在队列中。

简单的进展

当使用简单的进步,进步将更新只有在请求完成。 对于单个请求,这意味着你得到两个进展更新- 0%完成,和100%完成。 与四个请求队列,你会得到五进步更新,0%,25%,50%,75%和100%,每个增量代表请求已经完成。

简单的进步(showAccurateProgress = NO)是默认ASINetworkQueues,非常适合队列和大量小上传/下载。

准确的进度

当使用准确的进步,进步将更新发送或接收到的字节。 最好的请求发送或接收大量的数据,并将提供一个更好的表明多少数据已发送或接收请求,需要一些时间。

使用准确的进度会稍微降低上传的性能,因为进步代表(可能是UIProgressViews或NSProgressIndicators)将更频繁地重绘。

使用准确的进步对下载的性能有更大的影响,当使用一个队列,队列以来将首先执行一个HEAD请求它包含每个GET请求,这样就可以确定的总规模数据下载下载开始之前。 使用准确的进步是强烈推荐如果你从一个队列下载大文件,但你应该避免含有大量小下载队列。

准确的进步(showAccurateProgress = = YES)是默认的ASIHTTPRequests同步运行。

自定义进度跟踪

ASIProgressDelegate协议定义所有的方式代表可以更新请求的进展。 在大多数情况下,设定uploadProgressDelegate和/或downloadProgressDelegate NSProgressIndicator或UIProgressView就足够了。 然而,如果您希望执行更复杂的进展跟踪,你的进步代表应该优先于setProgress实现以下方法:(iOS)或setDoubleValue:/
setMaxValue:(Mac)。 这些方法允许您获得更新的实际发送或接收的字节数,而不是数在0和1之间的简单方法。

方法downloadProgressDelegates

要求:didReceiveBytes:会要求你downloadProgressDelegate每次请求下载更多的数据。
(注意,这是截然不同的要求:didReceiveData:方法,你定期委托可以实现)。
要求:incrementDownloadSizeBy:将下载的大小改变时,传递的参数是数量应该增加下载的大小。 这通常发生在当请求接收响应头和发现下载的大小。

方法uploadProgressDelegates

要求:didSendBytes:呼吁你uploadProgressDelegate每次请求已经发送更多的数据。重要:调用这个方法将使用小于零当一个请求需要删除上载进度(通常当上传数据,但没有身份验证或其他原因需要再次运行)。
要求:incrementUploadSizeBy:时将调用上传的大小变化。通过大小经常会低于零请求调整上传大小,考虑内部缓冲区的大小所使用的操作系统。

处理HTTP身份验证

如果你连接到的服务器需要身份验证,您可能想看一看这个流程图显示如何ASIHTTPRequest发现和凭证适用于请求。

指定一个用户名和密码使用的URL

NSURL *url = [NSURL URLWithString:@"http://username:password@allseeing-i.com/top_secret/"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];

设置用户名和密码使用的请求

NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com/top_secret/"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setUsername:@"username"];
[request setPassword:@"password"];

存储凭证在钥匙链

如果你打开keychainPersistence,任何有效的用户名和密码提供将存储在钥匙链。
后续请求将重用用户名和密码从钥匙链,即使你辞职重新启动应用程序。

NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com/top_secret/"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setUseKeychainPersistence:YES];
[request setUsername:@"username"];
[request setPassword:@"password"];

如果您想要使用的密钥链但宁愿管理自己,你可能会发现钥匙链的类方法有关ASIHTTPRequest。 h有帮助。

在会话中存储凭证

如果useSessionPersistence打开(默认情况下),ASIHTTPRequest凭证存储在内存和可以为后续请求重用他们。

NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com/top_secret/"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setUsername:@"username"];
[request setPassword:@"password"];
[request setUseSessionPersistence:YES]; //Shouldn't be needed as this is the default

//Should reuse our username and password
request = [ASIHTTPRequest requestWithURL:url];

NTLM身份验证

与Windows server使用NTLM验证方案中,您还需要指定的域进行身份验证。

NSURL *url = [NSURL URLWithString:@"http://my.windows.server/top_secret/"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setUsername:@"username"];
[request setPassword:@"password"];
[request setDomain:@"my-domain"];

使用代表团提供凭证

而不是提前指定身份验证凭证,您可能更愿意让每个请求问其委托凭证如果不能找到它们在会话中验证缓存或钥匙链。 这可能是有用的,如果你想连接到服务器,你事先不确定什么样的身份验证需要(如果有的话)。

确保你的委托实现authenticationNeededForRequest:,ASIHTTPRequest将暂停请求虽然等待委托让它知道凭证使用。 当你有你需要的凭证,可以把它们放在请求,并调用(请求retryUsingSuppliedCredentials);。 如果你想取消,你必须调用[请求cancelAuthentication]。
这将取消请求。

v1.0.8,请求代表只会接收一个authenticationNeededForRequest:或proxyAuthenticationNeededForRequest:。 其他请求时需要身份验证将暂停委托处理第一个请求。 如果提供凭证,任何正在其他请求将试图重用他们,假设他们是有效的url。 如果委托取消认证,和队列的shouldCancelAllRequestsOnFailure是肯定的,所有的其他请求将取消没有试图要求的凭证。



你不能使用代表团模式进行身份验证时使用同步请求。

在旧版本这将导致应用程序挂起的v1.0.8委派方法将不再被称为。



目前使用内置的身份验证对话框(iOS)

新v1.0.8 ASIAuthenticationDialog类。 这主要是用于处理身份验证代理(见下文),但是它可用于要求用户输入凭据进行身份验证的网路。

最好的用户体验,大多数应用程序连接到一个单一的服务应该实现authenticationNeededForRequest:代表在他们的请求,或完全避免使用delegation-style身份验证。 然而,可能会有一些场合使用ASIHTTPRequest的标准定期验证身份验证对话框可能是有利的:

你不想创建自己的登录表单
您可能需要从外部源获取数据,并不是某些是否需要身份验证

在这些情况下,shouldPresentAuthenticationDialog设置为true,您的请求,,如果你的代表没有实现authenticationNeededForRequest:,用户将看到对话框。

只有一个对话框会出现,其他请求要求身份验证对话框将暂停,是可见的。 如果提供凭证,任何正在其他请求将试图重用他们,假设他们是有效的url。 如果委托取消认证,和队列的shouldCancelAllRequestsOnFailure是肯定的(按默认),将取消所有其他请求没有试图要求的凭证。

同步请求的身份验证对话框不会出现。

对话框部分是仿照Safari在iPhone上使用的身份验证对话框,并包括:

网络服务器的消息表明这些凭据(而不是一个代理)
服务器的主机名或IP连接
身份验证领域(如果提供)
字段输入一个用户名和密码
当连接到一个服务器,它使用NTLM方案,还包括一个字段域的对话框
注意是否凭证是否发送纯文本(即:他们发送纯文本只使用基本身份验证时没有SSL)

如果你想改变你的外观和感觉,子类ASIHTTPRequest,覆盖showAuthenticationDialog显示您的自定义对话框或ASIAuthenticationDialog子类。

服务器要求他们之前提供凭证



重要的

行为的这个特性改变了v1.8.1使用基本身份验证请求,和您可能需要更新您的代码。

ASIHTTPRequest可以提供凭证到服务器(如果它有凭证使用)当它第一次发出请求,而不是等待服务器要求的凭证。 这可能导致使用身份验证的应用程序更好的性能,因为它避免了额外的请求。

引发这种行为对于使用基本身份验证的请求,您应该手动设置请求的authenticationScheme使用基本:

[request setAuthenticationScheme:(NSString *)kCFHTTPAuthenticationSchemeBasic];

对于其他身份验证方案,凭证可以在服务器之前提出要求,但只有在另一个请求与服务器已成功验证。

您可能希望禁用这个特性如果:

您的应用程序可以使用多个组凭证与同一个服务器
为您的应用程序安全是至关重要的。 使用这个特性在本质上是不太安全,因为凭证发送之前你有机会验证连接到你以为你已经连接到服务器。

禁用此功能,使用这段代码:

[request setShouldPresentCredentialsBeforeChallenge:NO];

饼干

持续的饼干

ASIHTTPRequest允许您使用全球存储共享的所有Mac OS X应用程序使用CFNetwork或NSURLRequest api。 如果useCookiePersistence(默认情况下),饼干将存储在共享NSHTTPCookieStorage容器,和重用在其他自动请求。
值得注意的是,ASIHTTPRequest饼干可能在其他应用程序中创建特定请求。如果他们是有效的

你可以清除所有cookie中创建一个会话一样:

[ASIHTTPRequest setSessionCookies:nil];

在这种情况下,“会话cookie”指的是所有cookie中创建一个会话,而饼干没有截止日期(通常被称为会话cookie),当应用程序退出时删除。

另外,便利类方法clearSession将清除所有cookie创建会话期间,连同任何缓存的身份验证数据。

处理饼干自己

如果你喜欢,你可以关掉useCookiePersistence,和管理手工饼干一个特定请求的设置:

//Create a cookie
NSDictionary *properties = [[[NSMutableDictionary alloc] init] autorelease];
[properties setValue:[@"Test Value" encodedCookieValue] forKey:NSHTTPCookieValue];
[properties setValue:@"ASIHTTPRequestTestCookie" forKey:NSHTTPCookieName];
[properties setValue:@".allseeing-i.com" forKey:NSHTTPCookieDomain];
[properties setValue:[NSDate dateWithTimeIntervalSinceNow:60*60] forKey:NSHTTPCookieExpires];
[properties setValue:@"/asi-http-request/tests" forKey:NSHTTPCookiePath];
NSHTTPCookie *cookie = [[[NSHTTPCookie alloc] initWithProperties:properties] autorelease];

//This url will return the value of the 'ASIHTTPRequestTestCookie' cookie
url = [NSURL URLWithString:@"http://allseeing-i.com/ASIHTTPRequest/tests/read_cookie"];
request = [ASIHTTPRequest requestWithURL:url];
[request setUseCookiePersistence:NO];
[request setRequestCookies:[NSMutableArray arrayWithObject:cookie]];
[request startSynchronous];

//Should be: I have 'Test Value' as the value of 'ASIHTTPRequestTestCookie'
NSLog(@"%@",[request responseString]);

处理压缩响应和压缩的要求

使用gzip压缩处理响应数据

v0.9,ASIHTTPRequest将通知服务器,它可以接受数据使用gzip压缩。 如果你升级ASIHTTPRequest在现有的项目中,看到的设置说明对于如何与zlib的细节。

之前许多网路可以压缩数据发送给客户端,这导致更快的下载速度和较低的带宽使用,代价是额外的服务器上的CPU时间(压缩数据)和客户端(解压缩数据)。 一般来说,只有某些类型的数据将被压缩——许多二进制格式JPEG、GIF,PNG,SWF和PDF已经压缩他们的数据,所以gzip压缩通常不习惯寄给客户。 文本文件网页和gzip压缩XML文档是完美的候选人,因为它们往往包含大量的重复信息。

如何设置apache使用mod_deflate gzip数据吗

Apache 2。 x和上面附带mod_deflate扩展,允许它透明的压缩某些类型的数据。 打开它,你需要启用mod_deflate在apache配置文件中,并将mod_deflate指令添加到您的虚拟主机配置,或者你。 htaccess。更多信息可以参考这里

使用gzip ASIHTTPRequest

- (IBAction)grabURL:(id)sender
{
NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
// YES is the default, you can turn off gzip compression by setting this to NO
[request setAllowCompressedResponse:YES];
[request startSynchronous];
BOOL *dataWasCompressed = [request isResponseCompressed]; // Was the response gzip compressed?
NSData *compressedResponse = [request rawResponseData]; // Compressed data
NSData *uncompressedData = [request responseData]; // Uncompressed data
NSString *response = [request responseString]; // Uncompressed data as a string
}

当allowCompressedResponse是真的,ASIHTTPRequest将接受编码头添加到请求指定我们可以接受gzip响应数据。 如果响应报头包含指定了数据压缩的内容编码标头,调用responseDataresponseString将解压缩数据,然后返回它。
您可以通过调用原始压缩数据rawResponseData

gzip响应的动态膨胀

默认情况下,ASIHTTPRequest将等待一个请求完成充气(解压缩)gzip的反应。 通过设置的要求shouldWaitToInflateCompressedResponses财产不,你可以告诉ASIHTTPRequest膨胀数据进来。
在某些情况下,这可能会导致一个小速度提高,随着数据处理而请求正在等待更多的响应。

这个功能可能特别有用如果你需要解析响应流解析器(如XML或JSON解析器)。 启用了这个选项,你可以养活的数据直接通过实现您的解析器,因为它是要求:didReceiveData:你的代表。

注意,当shouldWaitToInflateCompressedResponses将不,原始(压缩)的数据将被丢弃。 在ASIHTTPRequest看到的评论。 更多信息。

使用gzip压缩的要求

新的请求的身体在v1.0.3 gzip压缩。 使用此功能,您的应用程序可以压缩POST或PUT操作通过设置的内容shouldCompressRequestBody是的。
shouldCompressRequestBody在默认情况下是没有的。

Apache的mod_deflate可以自动充气(减压)gzip请求当配置了尸体SetInputFilter缩小(更多信息)。
这种方法适用于CGI内容,但当您使用的是一个Apache模块构建为一个资源筛选(比如国防部PHP)。 在这些情况下,您需要抬高自己的数据。



ASIHTTPRequest不能检查服务器是否可以接受gzip请求主体。 使用此功能只有在某些服务器你会明白gzip的身体说话。

避免gzip格式的内容,已经在使用压缩(如JPEG或PNG和GIF / PDF / SWF),你很可能会发现包含的压缩版本比原来的大。

恢复中断下载

v0.94,ASIHTTPRequest能恢复部分下载。

- (IBAction)resumeInterruptedDownload:(id)sender
{
NSURL *url = [NSURL URLWithString:
@"http://allseeing-i.com/ASIHTTPRequest/Tests/the_great_american_novel.txt"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];

NSString *downloadPath = @"/Users/ben/Desktop/my_work_in_progress.txt";

// The full file will be moved here if and when the request completes successfully
[request setDownloadDestinationPath:downloadPath];

// This file has part of the download in it already
[request setTemporaryFileDownloadPath:@"/Users/ben/Desktop/my_work_in_progress.txt.download"];
[request setAllowResumeForFileDownloads:YES];
[request startSynchronous];

//The whole file should be here now.
NSString *theContent = [NSString stringWithContentsOfFile:downloadPath];
}

这只适合下载数据到一个文件,你必须设置allowResumeForFileDownloads是的:

下载任何你可能想恢复在未来(或ASIHTTPRequest将删除临时取消或dealloced时下载文件)
任何你想下载的简历

此外,你必须设置一个临时下载路径(setTemporaryFileDownloadPath),部分数据的路径。
新的数据将被加到这个文件,文件移动到downloadDestinationPath当成功完成下载。

恢复工作在temporaryFileDownloadPath通过读取文件的大小,然后使用请求的其他文件范围:字节= xHTTP报头。



ASIHTTPRequest不检查的存在Accept-Ranges头(因为一个额外的开销HEAD请求),所以只有使用此功能时,你一定你连接到该服务器支持部分下载你想下载的资源。

流直接从磁盘请求的身体

v0.96,ASIHTTPRequest可以使用磁盘上的文件请求主体。 这意味着它不再是必要的请求主体在内存中,这将导致大幅减少内存使用POST或PUT操作。

有几种方法可以使用这个功能:

ASIFormDataRequests

NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com/ignore"];
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
[request setPostValue:@"foo" forKey:@"post_var"];
[request setFile:@"/Users/ben/Desktop/bigfile.txt" forKey:@"file"];
[request startSynchronous];

ASIFormDataRequests自动使用此功能时使用setFile:forKey:。 请求将创建一个临时文件,该文件将包含完整的身体。 文件一次写一点有关身体的一部分。 请求使用CFReadStreamCreateForStreamedHTTPRequest创建,使用读流文件作为源。

定期ASIHTTPRequests

如果你知道你的请求将会很大,打开流从磁盘请求:

[request setShouldStreamPostDataFromDisk:YES];

在下面的示例中,我们将NSData对象添加到身体一次。 这样做有两种方法——添加数据从内存(appendPostData:),或appendPostDataFromFile:添加一个文件的内容。

NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com/ignore"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setShouldStreamPostDataFromDisk:YES];
[request appendPostData:myBigNSData];
[request appendPostDataFromFile:@"/Users/ben/Desktop/bigfile.txt"];
[request startSynchronous];

在本例中,我们想直接把一个大文件。 我们设置setPostBodyFilePath自己,ASIHTTPRequest将使用该文件作为文章的身体。

NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com/ignore"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setRequestMethod:@"PUT"];
[request setPostBodyFilePath:@"/Users/ben/Desktop/another-big-one.txt"];
[request setShouldStreamPostDataFromDisk:YES];
[request startSynchronous];




重要的你不应该使用setPostBody在相同的请求任何上述方法——它们是相互排斥的。
setPostBody只能使用自己如果你想建立请求主体,并计划在内存中保持请求主体。

使用下载缓存



ASIDownloadCache API和ASICacheDelegate v1.8已经改变,你需要更新你的代码从v1.7如果你更新。

特别是,缓存策略的选择是不同的,你现在可以结合多个单个请求的缓存策略。

ASIHTTPRequest可以自动下载数据存储在缓存,以备未来使用。 这在很多情况下很有用:

您想要访问的数据在没有网络连接,你不能再下载它
你想下载的东西只有当它改变了自从你上次下载它
你正在与永远不会改变的内容,所以你只需要下载一次

在早期版本的ASIHTTPRequest,处理上述情况就意味着自己手动存储数据。 使用下载缓存可能消除需要编写任何本地存储机制在某些情况下。

ASIDownloadCache是一个简单的URL缓存,可以用于缓存的响应GET请求。 有资格获得响应缓存,请求必须成功(没有错误),和服务器必须返回一个HTTP响应代码200 OK,或者,v1.8.1,301年、302年、303年和307年定向状态代码。

打开响应缓存很容易:

[ASIHTTPRequest setDefaultCache:[ASIDownloadCache sharedCache]];

在你这样做之后,所有请求将自动使用缓存。 如果你喜欢,你可以设置单个请求使用共享缓存的基础上,根据实际情况:

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDownloadCache:[ASIDownloadCache sharedCache]];

你不局限于单个缓存——您可以创建尽可能多的缓存。 当你创建一个缓存,您必须设置存储路径缓存——这应该是一个文件夹你有写访问:

ASIDownloadCache *cache = [[[ASIDownloadCache alloc] init] autorelease];
[cache setStoragePath:@"/Users/ben/Documents/Cached-Downloads"];

// Don't forget - you are responsible for retaining your cache!
[self setMyCache:cache];

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDownloadCache:[self myCache]];

关于缓存策略

缓存策略的主要途径时控制信息存储在缓存中,当缓存的数据将用于优先下载数据了。

单个请求的缓存策略可以使用请求的cachePolicy控制财产。 使用位掩码定义缓存策略,因此您可以组合多个选项来创建你想要的政策:

// Always ask the server if there is new content available,
// If the request fails, use data from the cache even if it should have expired.
[request setCachePolicy:ASIAskServerIfModifiedCachePolicy|ASIFallbackToCacheIfLoadFailsCachePolicy];

您可以使用以下选项来定义一个请求的缓存策略:

ASIUseDefaultCachePolicy默认的缓存策略。 当你使用这个设置一个请求,它将使用缓存的defaultCachePolicy。 ASIDownloadCache的默认缓存策略是“ASIAskServerIfModifiedWhenStaleCachePolicy”。 你不应该把这个与其他选项。
ASIDoNotReadFromCacheCachePolicy不会请求从缓存读取时使用此选项。
ASIDoNotWriteToCacheCachePolicy请求将不会保存到缓存时,使用此选项。
ASIAskServerIfModifiedWhenStaleCachePolicy这是默认为ASIDownloadCaches缓存策略。 当使用这个,请求首先会查找是否在缓存中缓存响应可用。 如果没有缓存数据,请求将正常进行。

如果有缓存的数据没有过期,请求没有联系服务器将使用缓存数据。 如果缓存数据有过期,请求执行一个条件会更新版本是否可用。
如果服务器缓存数据目前说,将使用缓存数据,新数据将不会下载。 在这种情况下,缓存的失效时间将被更新以匹配新的有效期从服务器。 如果服务器提供更新后的内容,它将被下载,新数据写入缓存到期。
ASIAskServerIfModifiedCachePolicy这是一样的ASIAskServerIfModifiedWhenStaleCachePolicy总是问,除了请求服务器更新的数据是否可用。
ASIOnlyLoadIfNotCachedCachePolicy使用此选项时,将始终使用缓存数据是否存在,即使它应该已经过期。
ASIDontLoadCachePolicy使用此选项时,请求会成功只有一个响应已经缓存。 如果没有缓存响应一个请求,请求将会停止,也没有将错误请求。
ASIFallbackToCacheIfLoadFailsCachePolicy使用此选项时,请求将后备缓存数据如果请求失败。 如果使用缓存数据后失败,请求会成功,没有错误。 你平时与他人结合使用这个选项,因为它仅用于指定行为出现问题时使用。
当你设置defaultCachePolicy属性缓存,所有请求,使用缓存将使用缓存策略,除非他们有一个自定义缓存策略集。

关于存储策略

存储策略允许您定义一个缓存多久将存储特定的反应。 ASIHTTPRequest目前支持两种存储策略:

ASICacheForSessionDurationCacheStoragePolicy是默认的。 响应将存储会话期间,并将第一次使用缓存,删除或者当[ASIHTTPRequest
clearSession]。

ASICachePermanentlyCacheStoragePolicy,永久保存缓存的响应。
要使用这个存储策略,把它放在一个请求:

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setCacheStoragePolicy:ASICachePermanentlyCacheStoragePolicy];

手动清除缓存,电话clearCachedResponsesForStoragePolicy:的存储策略,传递你想删除缓存数据:

[[ASIDownloadCache sharedCache] clearCachedResponsesForStoragePolicy:ASICachePermanentlyCacheStoragePolicy];

其他缓存相关的特性

// When you turn shouldRespectCacheControlHeaders off, the cache will store responses even if the server
// has explictly asked for them not be be cached (eg with a cache-control or pragma: no-cache header)
[[ASIDownloadCache sharedCache] setShouldRespectCacheControlHeaders:NO];

// Set secondsToCache on the request to override any expiry date for the content set by the server, and store
// this response in the cache until secondsToCache seconds have elapsed
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setSecondsToCache:60*60*24*30]; // Cache for 30 days

// After a request has run, didUseCachedResponse will return YES if the response was returned from the cache
[request didUseCachedResponse];

// Ask the cache for a path to store the response. This is the most efficient way to use a download cache,
// since data doesn't have to be copied into the cache when the request completes.
[request setDownloadDestinationPath:
[[ASIDownloadCache sharedCache] pathToStoreCachedResponseDataForRequest:request]];

编写自己的缓存

如果你已经有一个下载缓存和ASIHTTPRequest想插进去就可以了,或者你更喜欢写你自己的,你的缓存实现ASICacheDelegate协议。

节流带宽

v1.0.7,ASIHTTPRequest可以节流所有请求使用的带宽为防止一个用户定义的限制。 这可以帮助iPhone应用程序发送或接收大量的数据通过应用程序商店审查过程。

节流是通过使用全局限制(以字节为单位)有多少可以一秒钟接收和传输数据。 所有请求共享这一限制。 当他们发送或接收数据,ASIHTTPRequest跟踪多少数据已发送或接收最后一秒。 如果一个请求超过限制,任何其他运行还必须等待当前测量周期的其余部分。

在iOS,您可以告诉ASIHTTPRequest时自动打开节流使用WWAN(GPRS / Edge / 3 g)连接,它会自动切换到WiFi时把它关掉。

// Will limit bandwidth to the predefined default for mobile applications when WWAN is active.
// Wi-Fi requests are not affected
// This method is only available on iOS
[ASIHTTPRequest setShouldThrottleBandwidthForWWAN:YES];

// Will throttle bandwidth based on a user-defined limit when when WWAN (not Wi-Fi) is active
// This method is only available on iOS
[ASIHTTPRequest throttleBandwidthForWWANUsingLimit:14800];

// Will prevent requests from using more than the predefined limit for mobile applications.
// Will limit ALL requests, regardless of whether Wi-Fi is in use or not - USE WITH CAUTION
[ASIHTTPRequest setMaxBandwidthPerSecond:ASIWWANBandwidthThrottleAmount];

// Log how many bytes have been received or sent per second (average from the last 5 seconds)
NSLog(@"%qi",[ASIHTTPRequest averageBandwidthUsedPerSecond]);




重要:读这之前使带宽节流:

应该考虑带宽节流实验特点:使用在你的自己的风险。
不设置带宽限制过低——最好不要低于ASIWWANBandwidthThrottleAmount吗
您的应用程序使用的实际带宽总是会略高于设定上限,因为测量带宽不包括HTTP标头使用的带宽。
ASIWWANBandwidthThrottleAmount不是官方的价值,据我所知,没有带宽限制已经正式出版。
你不应该打开带宽限制,除非您的应用程序可能会发送或接收大量数据。 最好把它唯一只有在执行请求下载或上传大量的数据,和在其他的时候发生性接触都得离开了。
通常是毋庸置疑的,但我不能保证你的应用程序不会被拒绝使用过高的带宽,当你打开节流。

客户端证书的支持

如果您的服务器要求客户端证书的使用,尽可能v1.8现在发送你的请求。

// Will send the certificate attached to the identity (identity is a SecIdentityRef)
[request setClientCertificateIdentity:identity];

// Add an additional certificate (where cert is a SecCertificateRef)
[request setClientCertificates:[NSArray arrayWithObject:(id)cert]];

有一个helper函数ClientCertificateTests.m在iPhone
/ iPad示例应用程序,可以创建一个从PKCS12 SecIdentityRef数据(该函数只能在iOS)。

使用代理

ASIHTTPRequest可以自动检测系统代理设置,将它们应用于请求。 v1.0.6,它还支持PAC文件代理配置和验证代理。

默认情况下,ASIHTTPRequest将尝试自动检测代理设置。 但是,如果您愿意,您可以手动设置代理设置:

// Configure a proxy server manually
NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com/ignore"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setProxyHost:@"192.168.0.1"];
[request setProxyPort:3128];

// Alternatively, you can use a manually-specified Proxy Auto Config file (PAC)
// (It's probably best if you use a local file)
[request setPACurl:[NSURL URLWithString:@"file:///Users/ben/Desktop/test.pac"]];

认证代理

在Mac OS,ASIHTTPRequest可以自动检测凭证用于身份验证代理系统首选项中指定。 在iOS,ASIHTTPRequest不能自动检测用于身份验证的凭证代理,所以你必须手动设置它们,使用代表团来问问你的控制器/用户适当的凭证,或让ASIAuthenticationDialog问用户。
一旦取得了有效的代理证书,他们存储在密钥链(当useKeychainPersistence)和自动重用。

手动为代理指定的凭据

NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com/ignore"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setProxyHost:@"192.168.0.1"];
[request setProxyPort:3128];

// Set a username and password for authenticating proxies
[request setProxyUsername:@"bencopsey"];
[request setProxyPassword:@"password"];

// For NTLM proxies, you can also set the domain (NTLM proxies are untested!)
[request setProxyDomain:@"la.la.land"];

使用代表团要求代理凭证

这相同的方式工作使用代表提供凭证定期验证,除了你的代表必须响应proxyAuthenticationNeededForRequest:(原proxyAuthorizationNeededForRequest:)。



目前使用内置的身份验证对话框(iOS)

新v1.0.8 ASIAuthenticationDialog类。 这可以用来问网络服务器和代理服务器进行身份验证的用户的凭据。

如果你的代表没有回复proxyAuthenticationNeededForRequest:默认情况下,ASIHTTPRequest将显示一个对话框提示用户提供凭证。 似乎为代理服务器在默认情况下,所有应用程序使用ASIHTTPRequest可以使用身份验证代理没有任何额外的开发人员的努力。

代理身份验证对话框不会出现同步请求。

如果你不喜欢使用代理身份验证对话框中,要么实现proxyAuthenticationNeededForRequest:在你的代理,或一组shouldPresentProxyAuthenticationDialog为false(在这种情况下,您的应用程序将无法连接认证代理)。 如果你想改变你的外观和感觉,子类ASIHTTPRequest,覆盖showProxyAuthenticationDialog显示您的自定义对话框或ASIAuthenticationDialog子类。

各种各样的功能

定制用户代理

设置用户代理应用程序将使用,这样做:

[ASIHTTPRequest setDefaultUserAgentString:@"MyApp 1.0"]

如果你不设置一个用户代理,ASIHTTPRequest将为您创建一个。 一个例子(Mac OS应用程序):

我的应用程序1.0(麦金塔电脑,Mac OS X 10.5.7;en_GB)

你也可以设置用户代理基于每个请求:

[request setUserAgent:@"MyApp 1.0"]

继续当你的应用程序请求进入背景iOS

// iOS 4+ only
[request setShouldContinueWhenAppEntersBackground:YES];

监视网络活动

// Log the average bandwidth used (in bytes) per second over the last 5 seconds
NSLog(@"%llu",[ASIHTTPRequest averageBandwidthUsedPerSecond]);

if ([ASIHTTPRequest isNetworkInUse]) {
// ASIHTTPRequest has requests in progress that are using the network
}

禁用自动更新到网络活动指标(iOS)

默认情况下,ASIHTTPRequests将显示网络活动指标(在状态栏)在iOS设备请求使用网络。 如果你喜欢管理这个自己,您可以禁用这些更新:

[ASIHTTPRequest setShouldUpdateNetworkActivityIndicator:NO];

时自动重试请求超时

发出请求重试最多2次,如果他们遇到一个超时:

[request setNumberOfTimesToRetryOnTimeout:2];

配置持久连接

默认情况下,ASIHTTPRequest将试图保持连接到服务器开放,这样他们可以重用其他请求相同的服务器(这通常导致显著的速度增加,特别是如果你有许多小的请求)。 持久连接将使用时自动连接到HTTP 1.1服务器,或者当服务器发送一个点火电极头。 持久连接不习惯如果服务器显式地发送一个连接:紧密的头。 此外,ASIHTTPRequest不会使用持久连接请求,包括身体(如POST或PUT)在默认情况下(v1.8.1)。
你可以强制使用持久连接这些请求通过手动设置请求方法,然后再打开持久连接:

[request setRequestMethod:@"PUT"];
[request setShouldAttemptPersistentConnection:YES];

许多服务器不提供任何信息在响应头多长时间保持连接打开,并可能随时关闭连接请求后完成。 如果服务器不发送任何信息的连接应使用多久,ASIHTTPRequest将保持连接到服务器开放60秒任何请求完成后使用它们。 根据您的服务器配置,这可能是太长,或者太短。

如果这个超时时间太长,服务器可能会关闭连接之前下一个请求有机会使用它。 遇到错误时,ASIHTTPRequest这似乎是一个封闭的连接,它将重试请求一个新的连接。

如果这个超时时间太短,服务器可能会乐意保持连接开放时间更长,但ASIHTTPRequest会不必要地打开一个新连接,这将导致性能损失。

// Set the amount of time to hang on to a persistent connection before it should expire to 2 minutes
[request setPersistentConnectionTimeoutSeconds:120];

// Disable persistent connections entirely
[request setShouldAttemptPersistentConnection:NO];

强制使用HTTP 1.0

[request setUseHTTPVersionOne:YES];

禁用安全证书验证

您可能希望使用这个测试如果你有一个自签名安全证书。 我建议从受信任的证书颁发机构购买证书和毕业证书验证生产应用程序打开。

[request setValidatesSecureCertificate:NO];

调试选项

ASIHTTPRequest提供了一些旗帜可能有助于调试请求的行为。 这些可以在ASIHTTPRequestConfig.h

当你打开其中一个旗帜,请求将打印出他们所做的信息到控制台。

DEBUG_REQUEST_STATUS

打印信息对整个请求生命周期——开始、完成上传,完成下载等。

DEBUG_THROTTLING

打印信息(大约)使用多少带宽请求,如果请求被压制,这是如何发生的信息。 结合DEBUG_REQUEST_STATUS,这可以有助于调试超时,正如你所看到的点请求停止发送或接收数据。

DEBUG_PERSISTENT_CONNECTIONS

打印信息如何重用持久连接请求。 如果你看到输出:

Request attempted to use connection #1, but it has been closed - will retry with a new connection

… 这是一个迹象,表明你对价值persistentConnectionTimeoutSeconds可能太高了。 看到笔记配置持久连接更多信息。

DEBUG_HTTP_AUTHENTICATION

新v1.8.1:打印出的信息如何处理HTTP请求身份验证(基本、消化或NTLM)。

DEBUG_FORM_DATA_REQUEST

打印的摘要ASIFormDataRequest将发送的请求主体。 这只是使用ASIFormDataRequest时有用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: